[英]How to handle multiple click events with same Sub
我正在為我的視覺基礎課程制作游戲。 我有多個圖片框,點擊后會分別顯示隱藏的圖像。 游戲的目的是找到匹配的圖片(足夠簡單)。
在最簡單的層面上,我有16個圖片框。 隨着難度的增加,圖片框的數量增加。
對於每個圖片框,我目前有一個事件處理程序如下(默認由visual studio創建):
Private Sub pictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles pictureBox1.Click
在里面,我打算用它來改變圖片框中的圖像,如下所示:
pictureBox1.Image = (My.Resources.picture_name)
我想知道是否有辦法讓一個Sub處理所有按鈕單擊,並更改相應的圖片框,而不是有16個單獨的處理程序。 例如:
Private Sub pictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles pictureBox1.Click, pictureBox2.Click, pictureBox3.Click, ... pictureBox16.Click
並執行以下操作:
' Change appropriate picture box
這是它的樣子(現在):
要找出單擊了哪個PictureBox,您只需要查看sender變量。 顯然你必須將它從Object類型轉換為PictureBox類型:
Dim ClickedBox As PictureBox
ClickedBox = CType(sender, PictureBox)
我個人會做的是將你的公共EventHandler附加到你的PictureBox,給每個PictureBox一個索引的標簽 ,除非你想對你的名字進行選擇。 然后你做這樣的事情。
Private Sub PictureBox1_Click(sender As System.Object, e As System.EventArgs) Handles PictureBox1.Click, PictureBox2.Click, ...
Dim pb As PictureBox = CType(sender, PictureBox)
Select Case CInt(pb.Tag)
Case 0
pb.Image = My.Resources.PictureName1
Case 1
pb.Image = My.Resources.PictureName2
...
End Select
End Sub
據我所讀,DirectCast比CType更受歡迎
DirectCast可以與'With / End With'結合使用,如下所示:
Private Sub PictureBox1_Click(sender As System.Object, e As System.EventArgs) Handles PictureBox1.Click, PictureBox2.Click, ...
With DirectCast(sender, PictureBox)
Select Case CInt(.Tag)
Case 0
.Image = My.Resources.PictureName1
Case 1
.Image = My.Resources.PictureName2
...
End Select
End With
End Sub
我也試過以下但這會導致奇怪的問題(控件消失)。
Using cbMe as CheckBox = DirectCast(sender, CheckBox)
cbMe.Checked = True
End Using
例如,遍歷所有控件
For Each ctr As Control In Me.Controls
If TypeOf ctr Is PictureBox Then
If ctr Is ActiveControl Then
' Do Something here
End If
End If
Next
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.