2017-04-13 17 views
0

在爲doubleclick執行特定代碼之後,我試圖調用一組列表框的click方法。在ListBox的DoubleClick方法中調用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」異常

 
Method MyProject1.Form1.ListBox1_Click not found 

但它的存在,看VB,它只是存在,在頂部,你看不出來?

謝謝你的幫助。

回答

0

嗯,我沒有你的問題的答案,但有一些返工,你會得到的地方。

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() 
    } 
+0

同意你的答案,是我的第一個想法。 但事情是,我已經像應用程序中的50列表框(隨着時間的推移而增加),並不想實現一個巨大的開關或如果像 「 如果DirectCast(發件人,列表框).name = ListBox1 .NAME然後 DoSomething1() ELSEIF DirectCast(發件人,列表框)。名稱= ListBox2.name然後 了doSomething2() 結束如果 「 然而,我可以在一個定義的格式的名字我的所有DoSomething的,並且盡反射法無論如何,我會讓你知道,如果這有效。 – Skippy

+0

我同意這一點。如果你有很多控制,這是矯枉過正的。讓我張貼! – Natrium

+1

好吧,花了我很長時間來修改我的每個列表框單擊處理程序。 (2)在你的建議中調用這個函數,如你的建議 (2)在事件函數中調用這個函數,如你的建議 (1)移動每個listbox1_Click,listbox2_Click,...的代碼在一個名爲listbox1Process,listbox2Process,... (2) 3)使用InvokeMember反饋(sender.name +「Process」 ,它的工作原理(我現在差不多已經死了) – Skippy

0

最終結果的基礎上,鈉的評論:

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