2013-11-25 42 views
1

我怎样才能缩短下来(比如到一个通用的处理程序/事件等):减少我使用的“手柄”数量?

Private Sub Picturebox_Click(sender As System.Object, e As System.EventArgs) _ 
    Handles a1.Click, a2.Click, a3.Click, a4.Click, a5.Click, b1.Click, b2.Click, 
      b3.Click, b4.Click, b5.Click, c1.Click, c2.Click, c3.Click, c4.Click, 
      c5.Click, d1.Click, d2.Click, d3.Click, d4.Click, d5.Click, e1.Click, 
      e2.Click, e3.Click, e4.Click, e5.Click, f1.Click, f2.Click, f3.Click, 
      f4.Click, f5.Click, g1.Click, g2.Click, g3.Click, g4.Click, g5.Click, 
      h1.Click, h2.Click, h3.Click, h4.Click, h5.Click, i1.Click, i2.Click, 
      i3.Click, i4.Click, i5.Click, j1.Click, j2.Click, j3.Click, j4.Click, 
      j5.Click 

每那些“点击”是50个图片框,和我打算至少增加另外50个。

回答

3

相反的形式通过所有图片框控件在设计控制显式声明的点击事件,只是循环的,就像这样:

For Each theControl As Control In Form1.Controls 
    If theControl.GetType Is GetType(PictureBox) Then 
     Dim thePictureBox As PictureBox = CType(theControl, PictureBox) 

     ' Route the click event of this picture box to your single handler 
     AddHandler thePictureBox.Click, AddressOf Me.thePictureBox_Click 
    End If 
Next 

现在你需要实现的实际处理程序,如下所示:

Private Sub thePictureBox_Click(sender As System.Object, e As System.EventArgs) 
    ' Cast the sender here to a picture box object 
    ' and do whatever you need to do when a picture box is clicked here 
End Sub 
+0

非常感谢,这个工作的,很容易修改和调整使用列表中使用。 –

+0

在“theControl”上放置一个断点,使用快速监视并查找可用于编写排除逻辑的属性。 – granadaCoder

+1

@WallaceBreen - 很棒,很高兴帮助,当你可以的时候随时投票回答。 :-) –

1

那么,您可以在一个包含所有需要的图像的循环中将事件处理函数设置为像这样的图像列表。

AddHandler b2.Click, AddressOf Picturebox_Click 
1

虽然卡尔是正确的,但他的每个循环都不会在您的表单上放置的容器中找到任何图片框。

试试下面这应该和你当然可以扩展逻辑适用于其他控件:

Dim ctrl As Control = Me 

    Do 
     ctrl = GetNextControl(ctrl, True) 

     If ctrl IsNot Nothing Then _ 

      Select Case ctrl.GetType.ToString 
       Case "System.Windows.Forms.PictureBox" 
        AddHandler ctrl.click, AddressOf myCustomButtonClick 
       Case Else 
        Exit Select 
      End Select 
     End If 
    Loop Until ctrl Is Nothing