2017-04-13 5 views
0

ダブルクリック用の特定のコードを実行した後に、リストボックスのセットの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(送信者、リストボックス).nameの= ListBox2.nameその後 DoSomething2() エンドそれでも 「 場合は、私が定義された形式ですべての私のdoSomethingに名前を付け、私の反射法を試すことができますとにかく、それがうまくいくかどうかを知らせます。 – Skippy

+0

私はそれに同意します。あなたがたくさんのコントロールを持っているなら、それは過剰です。私をつけてください! – Natrium

+1

私のリストボックスのクリックハンドラを変更するには、時間がかかりました。 私は何をしましたか: (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 
関連する問題