- - PR -
クリックされたボタンの判断
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-06-23 01:18
パッと思いついたのは Tag プロパティを使う方法です。
AddHandler kana(i).click, AddressOf MyClick のところで kana(i).Tag = i みたいに設定しておいて、イベントハンドラ内で、 sender の Tag から取得することができます。 | ||||||||||||
|
投稿日時: 2008-06-23 22:49
テッテさんこんばんは!
ご返答ありがとうございます!! 自分でコードを書いてみようと思ったのですが、考えがまとまらず、またまた書き込ませていただきました。 Tagを教えていただいたので、調べてみました。なんとなくですが雰囲気はつかめたような気がします。応用範囲がひろいんですね。 前回お答えいただいた中に kana(i).Tag = i を設定しておくとあるのですが、 For〜Next文中には入りませんよね? また’sender の Tag から取得することができます というのはなんとなく分かる気はするのですが、 具体的なコードの書き方が仕方がわかりません。どういったものになるんでしょうか? 勉強不足なうえに質問ばかりですみません。 | ||||||||||||
|
投稿日時: 2008-06-24 02:50
i = Convert.ToInt32(DirectCast(sender, Button).Tag)
キャストと変換でいけますよ〜 | ||||||||||||
|
投稿日時: 2008-06-24 10:12
ループの中でも大丈夫ですよ。 AddHandler 文の直前にでも、kana(i).Tag = i でいけると思うのですが、 何か問題がありましたか?
キャストについて勉強してください。 イベントハンドラの sender や Button.Tag プロパティはどちらも Object 型になっていますので、 取り出すときはキャストをしてやらないと、 Option Strict のときはコンパイルエラーになります。 (Option Strict はなるべく指定しておくことをお勧めします。) まず、sender を Button 型にキャストして、 その Tag プロパティを Integer 型にキャストして取得します。 VBではキャストには CType や DirectCast を使います。 i = DirectCast(DirectCast(sender, Button).Tag, Integer)
これでも結果は同じかも知れませんが、Integer で格納しているはずですから、 Convert じゃなくて DirectCast の方が効率がいいような気がします。 | ||||||||||||
|
投稿日時: 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-06-25 09:26
解決されたようでよかったです。
私はこう書いたはずですよ。 i = DirectCast(DirectCast(sender, Button).Tag, Integer) これなら上手くいくと思います。 | ||||||||||||
|
投稿日時: 2008-06-25 09:57
ちょっと失礼します。
Tagの値をデザイナ上から設定した場合、値はString型で入るみたいなので キャストできないはずです。回避するにはTagに明示的にIntegerの値を入れてやる 必要があると思うんですが、それだったら
でもいいような気がします。 [追記]
すいません。StringをIntegerにしようとして落ちてるのと勘違いしてました。。。 [/追記] _________________ //--- あやのこうじ@RapidExpress [ メッセージ編集済み 編集者: RapidExpress 編集日時 2008-06-25 10:07 ] | ||||||||||||
|
投稿日時: 2008-06-25 09:57
私の場合は Tag プロパティは使いませんが、もし使うなら sender からのキャストは TryCast を使って System.Windows.Forms.Control にします。 また Tag プロパティは Null チェックをします。
_________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 |