- PR -

クリックされたボタンの判断

投稿者投稿内容
テッテ
ベテラン
会議室デビュー日: 2008/03/16
投稿数: 91
投稿日時: 2008-06-23 01:18
パッと思いついたのは Tag プロパティを使う方法です。

AddHandler kana(i).click, AddressOf MyClick

のところで

kana(i).Tag = i

みたいに設定しておいて、イベントハンドラ内で、
sender の Tag から取得することができます。
はる
会議室デビュー日: 2008/06/21
投稿数: 13
投稿日時: 2008-06-23 22:49
テッテさんこんばんは!
ご返答ありがとうございます!!

自分でコードを書いてみようと思ったのですが、考えがまとまらず、またまた書き込ませていただきました。


Tagを教えていただいたので、調べてみました。なんとなくですが雰囲気はつかめたような気がします。応用範囲がひろいんですね。
前回お答えいただいた中に kana(i).Tag = i を設定しておくとあるのですが、
For〜Next文中には入りませんよね?

また’sender の Tag から取得することができます
というのはなんとなく分かる気はするのですが、
具体的なコードの書き方が仕方がわかりません。どういったものになるんでしょうか?


勉強不足なうえに質問ばかりですみません。
mitchin
会議室デビュー日: 2003/05/28
投稿数: 16
投稿日時: 2008-06-24 02:50
i = Convert.ToInt32(DirectCast(sender, Button).Tag)

キャストと変換でいけますよ〜
テッテ
ベテラン
会議室デビュー日: 2008/03/16
投稿数: 91
投稿日時: 2008-06-24 10:12
引用:

前回お答えいただいた中に kana(i).Tag = i を設定しておくとあるのですが、
For〜Next文中には入りませんよね?


ループの中でも大丈夫ですよ。
AddHandler 文の直前にでも、kana(i).Tag = i でいけると思うのですが、
何か問題がありましたか?

引用:

また’sender の Tag から取得することができます
というのはなんとなく分かる気はするのですが、
具体的なコードの書き方が仕方がわかりません。どういったものになるんでしょうか?


キャストについて勉強してください。
イベントハンドラの sender や Button.Tag プロパティはどちらも Object 型になっていますので、
取り出すときはキャストをしてやらないと、
Option Strict のときはコンパイルエラーになります。
(Option Strict はなるべく指定しておくことをお勧めします。)

まず、sender を Button 型にキャストして、
その Tag プロパティを Integer 型にキャストして取得します。
VBではキャストには CType や DirectCast を使います。

i = DirectCast(DirectCast(sender, Button).Tag, Integer)

引用:

i = Convert.ToInt32(DirectCast(sender, Button).Tag)


これでも結果は同じかも知れませんが、Integer で格納しているはずですから、
Convert じゃなくて DirectCast の方が効率がいいような気がします。
はる
会議室デビュー日: 2008/06/21
投稿数: 13
投稿日時: 2008-06-25 00:17
mitchinさん、テッテさんこんばんは。
ご返答ありがとうございます!

以下のようなプログラムを作ることができました!


ボタン1を押すと1の画像を表示
:
:
ボタン5を押すと5の画像を表示

という簡単なものにしてクリックされたボタンの判断をしました。
Public Class Form1
Dim kana(4) As Button
Dim gazo(4) As PictureBox
Dim i As Integer
_____

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load


kana(0) = Button1
kana(1) = Button2
kana(2) = Button3
kana(3) = Button4
kana(4) = Button5

gazo(0) = PictureBox1
gazo(1) = PictureBox2
gazo(2) = PictureBox3
gazo(3) = PictureBox4
gazo(4) = PictureBox5


For i = 0 To 4
kana(i).Tag = i
AddHandler kana(i).Click, AddressOf Myclick
Next


End Sub
_______
Private Sub Myclick(ByVal sender As System.Object, ByVal e As System.EventArgs)

★ i = Convert.ToInt32(DirectCast(sender, Button).Tag)

gazo(i).Visible = True

End Sub

End Class
_____

とすると、ボタンに対応させた画像が出てくるようになりました!

★の部分ですが、はじめテッテさんに教えていただきました
 i = DirectCast(DirectCast(sender, Button).Tag, String)
を書いたのですが

Invalid Cast Exception はハンドルされませんでした。
型System.Int32のオブジェクトをSystem.Stringにキャストできません

というエラーがでたので、書き換えてやってみたところ実行することができました。

まだ理解できてない部分がほとんどですが、本当にありがとうございます!!

次は↑をうまく使って画像だけでなくテーブルデータを呼び出していきたいと思います!

初心者の自分に丁寧に教えていただきましてありがとうございました。
またお世話になる機会があると思いますので、そのときもまたよろしくお願いします。
テッテ
ベテラン
会議室デビュー日: 2008/03/16
投稿数: 91
投稿日時: 2008-06-25 09:26
解決されたようでよかったです。

引用:

★の部分ですが、はじめテッテさんに教えていただきました
 i = DirectCast(DirectCast(sender, Button).Tag, String)
を書いたのですが


私はこう書いたはずですよ。

i = DirectCast(DirectCast(sender, Button).Tag, Integer)

これなら上手くいくと思います。
RapidExpress
常連さん
会議室デビュー日: 2007/11/11
投稿数: 42
お住まい・勤務地: おおさか
投稿日時: 2008-06-25 09:57
ちょっと失礼します。

引用:

私はこう書いたはずですよ。

i = DirectCast(DirectCast(sender, Button).Tag, Integer)

これなら上手くいくと思います。


Tagの値をデザイナ上から設定した場合、値はString型で入るみたいなので
キャストできないはずです。回避するにはTagに明示的にIntegerの値を入れてやる
必要があると思うんですが、それだったら

コード:

If IsNumeric(DirectCast(sender, Button).Tag.ToString) Then
i = Integer.Parse(DirectCast(sender, Button).Tag.ToString)
End If


でもいいような気がします。

[追記]
引用:

Invalid Cast Exception はハンドルされませんでした。
型System.Int32のオブジェクトをSystem.Stringにキャストできません


すいません。StringをIntegerにしようとして落ちてるのと勘違いしてました。。。
[/追記]

_________________
//---
 あやのこうじ@RapidExpress

[ メッセージ編集済み 編集者: RapidExpress 編集日時 2008-06-25 10:07 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-06-25 09:57
私の場合は Tag プロパティは使いませんが、もし使うなら sender からのキャストは TryCast を使って System.Windows.Forms.Control にします。 また Tag プロパティは Null チェックをします。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

スキルアップ/キャリアアップ(JOB@IT)