我想调用一个随机的PictureBoxN_Click事件。我怎么能在vb.net中做到这一点?
UPDATE BKPSERVER
set BKP_STATUS = 'S'
where CLIENT_IP = '192.168.0.16'
AND BKP_STATUS='R'
AND ROWID = ( SELECT MAX(ROWID)
FROM BKPSERVER b2
where b2.CLIENT_IP = '192.168.0.16'
AND b2.BKP_STATUS='R')
答案 0 :(得分:1)
首先,你不是在调用一个事件。事件被提出而不是你。在Click
上引发PictureBox
事件的唯一简单方法是使用鼠标单击它。
你所说的是调用一种方法。事件处理程序不是事件。事件处理程序是一种在引发事件时自动执行的方法。直接调用事件处理程序实际上是很糟糕的做法。
您应该做的是将要执行的代码放入其自己的方法中,该方法的参数类型为PictureBox
。然后,您可以从Click
的{{1}}事件处理程序以及您想要的任何其他位置调用该方法。如果你这样做,那么在这种情况下你甚至不必考虑任何PictureBoxes
事件,它应该如何,因为没有点击进行。
如果你为每个Click
做同样的事情,那么所有PictureBox
应该只有一个事件处理程序。如果要在单击PictureBoxes
时执行随机PictureBox
的代码,则选择随机Button
并将其传递给方法。 E.g。
PictureBox
答案 1 :(得分:1)
虽然我同意jmcilhinney的回答,但这里是如何做你最初要求的。请注意,这也向您展示了如何使用Controls.Find()获取对“所需PictureBox”的引用,“按名称”。我们使用Reflection来查找匹配的方法名称和Invoke()它:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Static R As New Random
Dim rndm As Integer = R.Next(1, 91) ' <-- return a value between 1 and 90 inclusive (yes, 91 is correct!)
Dim ctlName As String = "PictureBox" & rndm.ToString
Dim methodName As String = ctlName & "_Click"
Dim flags As Reflection.BindingFlags = Reflection.BindingFlags.IgnoreCase Or Reflection.BindingFlags.Instance Or Reflection.BindingFlags.Public Or Reflection.BindingFlags.NonPublic
Dim MI As _MethodInfo = Me.GetType.GetMethod(methodName, flags)
If Not IsNothing(MI) Then
Dim matches() As Control = Me.Controls.Find(ctlName, True)
If matches.Length > 0 AndAlso TypeOf matches(0) Is PictureBox Then
Dim pb As PictureBox = DirectCast(matches(0), PictureBox)
MI.Invoke(Me, New Object() {pb, New EventArgs})
End If
End If
End Sub