随机调用一个事件

时间:2017-01-01 23:45:28

标签: vb.net event-handling

我想调用一个随机的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')

2 个答案:

答案 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