【问题标题】:Invoke Click method in DoubleClick method of ListBox在ListBox的DoubleClick方法中调用Click方法
【发布时间】:2017-04-13 07:31:43
【问题描述】:

在为双击执行特定代码后,我正在尝试调用一组列表框的 click 方法。


Private Sub ListBox1_Click(sender As Object, e As System.EventArgs) Handles ListBox1.Click
    ' Do something 1
End Sub

Private Sub ListBox2_Click(sender As Object, e As System.EventArgs) Handles ListBox2.Click
    ' Do something 2
End Sub

Private Sub ListBoxes_DoubleClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.DoubleClick,
                                                                                                         ListBox2.DoubleClick
    ' Do something for doubleclick

    ' Invoke Click method
    Try
        Dim result As Object = Me.GetType().InvokeMember(sender.name + "_Click",
                                                         BindingFlags.Default Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.InvokeMethod,
                                                         Nothing, Nothing, New Object() {sender, Nothing})
    Catch ex As Exception
    End Try

End Sub

结果是“MissingMethodException”异常

方法 MyProject1.Form1.ListBox1_Click 未找到

但它就在那里,看 vb,它就在那里,在顶部,你看不到吗?

感谢您的帮助。

【问题讨论】:

    标签: vb.net winforms reflection listbox


    【解决方案1】:

    嗯,我没有你的问题的答案,但是通过一些返工,你会有所收获。

    Actuallu,你不想引发事件。你想调用正确的逻辑。

    这就是我解决这个问题的方法(在 C# 中):

        private void listBox1_Click(object sender, EventArgs e)
        {
            DoSomething1();
        }
    
        private void DoSomething1()
        {
            throw new NotImplementedException();
        }
    
        private void listBox2_Click(object sender, EventArgs e)
        {
            DoSomething2();
        }
    
        private void DoSomething2()
        {
            throw new NotImplementedException();
        }
    
        private void listBox_DoubleClick(object sender, EventArgs e)
        {
            var listbox = sender as ListBox;
    
            // some logic to find out which method to call here...
            // DoSomething1();
            // or 
            // DoSomething2()
        }
    

    【讨论】:

    • 同意你的回答,这是我的第一个想法。但问题是我喜欢应用程序中的 50 个 ListBox(随着时间的推移而增加)并且不想实现一个巨大的开关,或者如果使用类似“ if DirectCast(sender, ListBox).name = ListBox1.name Then DoSomething1 () Elseif DirectCast(sender, ListBox).name = ListBox2.name Then DoSomething2() End If " 不过,我可以以定义的格式命名我的所有 DoSomething 并尝试我的反射方法,我会告诉你是否有效.
    • 我同意这一点。如果您有很多控件,那就大材小用了。随时通知我!
    • 好的,我花了很长时间来修改我的每个列表框点击处理程序。我做了什么:(1)将每个listbox1_Click,listbox2_Click,...的代码移动到一个名为listbox1Process,listbox2Process,...的专用函数中(2)在事件函数中调用此函数,如您的提议(3)使用反射使用 InvokeMember(sender.name + "Process" 就可以了(我现在快死了)
    【解决方案2】:

    最终结果,基于 Natrium 的评论:

    Private Sub ListBox1_Click(sender As Object, e As System.EventArgs) Handles ListBox1.Click
        ListBox1Process()
    End Sub
    
    Private Sub ListBox2_Click(sender As Object, e As System.EventArgs) Handles ListBox2.Click
        ListBox2Process()
    End Sub
    
    Private Sub ListBox1Process()
        ' Do something 1
    End Sub
    
    Private Sub ListBox2Process()
        ' Do something 2
    End Sub
    
    Private Sub ListBoxes_DoubleClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.DoubleClick,
                                                                                                          ListBox2.DoubleClick
        ' Do something for doubleclick
    
        ' Invoke "Click" method
        Try
            Dim result As Object = Me.GetType().InvokeMember(sender.name + "Process",
                                                             BindingFlags.Default Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.InvokeMethod,
                                                             Nothing, Me, Nothing)
        Catch ex As Exception
        End Try
    
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      • 2011-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-08
      相关资源
      最近更新 更多