2011-06-27 6 views
1

VB.netでイベントを組み合わせる方法があるかどうかは疑問でした。私は、ウィンドウフォームを使用して、別のアクションを行う各ボタンの3つのイベントがあります。 3つのイベントを1つの方法でまとめたいのですが、これを行うのに問題があります。以下は、ボタンの1つの例です。質問の容易さのために、私は各サブの中のすべてのコードを削除しました。VB.netでのイベントの結合

Private Sub btnRightPos_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRightPos.Click 

End Sub 

Private Sub btnRightPos_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles btnRightPos.MouseDown 

End Sub 

Private Sub btnRightPos_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles btnRightPos.MouseUp 

End Sub 
+0

それぞれのイベントが異なるアクションを実行すると、それらをまとめて試してみるとどちらがどちらですか? – dbasnett

+0

3つのイベントをすべて1つのメソッドに入れることができれば、コードを単純化し、コード内の別々の場所に複数のメソッドを置くのがより簡単になります(これはコードが私に与えられてから、 )。メソッドのローカル変数に各イベントを参照し、適切なコードを実行するためにケース構造を使用する方法を見つけることができれば、どのイベントがどれであるかを簡単に知ることができます。これは、何らかの形でイベントを参照する方法があるかどうかを知りたかった問題です。 – James

答えて

4

MouseUpMouseDownは、このようなHandles btnRightPos.MouseDown, btnRightPos.MouseUpを言うことによって組み合わせることができます。

Private Sub btnRightPos_MouseDownAndDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles btnRightPos.MouseDown, btnRightPos.MouseUp 

End Sub 

それのイベントハンドラが異なる署名を持っているようButton.Clickは、他の2つと組み合わせることはできません。

コードを再利用するためにできることは、共通ロジックを別の関数に分けて、その関数をイベントハンドラから呼び出すことです。

+0

パラメータを気にしない場合は**結合することができます。私の答えを見てください。 VB.NETでは、パラメータなしのメソッドを使用して、「私は署名について気にしません。 – vcsjones

+1

@vcsjonesそれは分かりませんでしたが、複数のイベントに対して1つのハンドラを持っている場合には、ほとんどの場合、「sender」パラメータが必要です。 –

1

あなたは簡単にそれが依存

AddHandler obj.OnEvent, AddressOf MyEventHandler 

ですから、例えば

private Default_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) 

、その後

AddHandler btnRightPos.MouseUp, AddressOf Default_MouseUp 
AddHandler btnLeftPos.MouseUp, AddressOf Default_MouseUp 
2

を使用してこれを達成することができます。あなたは議論を気にしますか? sendereが必要ですか? 2つを組み合わせることができます。引数を気にしない場合は、3つすべてを組み合わせることができます。 Clickのシグネチャである理由は異なります。上下が同じ署名を共有しているので、彼らはこのように組み合わせることができる:

Private Sub btnRightPos_UpAndDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles btnRightPos.MouseDown, btnRightPos.MouseUp 

End Sub 

結合したい場合は、すべて3:

Private Sub btnRightPos_All() Handles btnRightPos.Click, btnRightPos.MouseUp, btnRightPos.MouseDown 

End Sub 

VB.NETはその仕事をすることができます興味深い機能を持っています任意のイベントを処理するためにパラメータのないメソッドを使用できます。効果的に「私は署名を気にしないで、それを働かせる」と言っています。

+0

私は議員については気にしません。私はあなたがサブを宣言する方法を理解していますが、私は事件や暴発の場合はイベントを使用することができないので、私はどのようにサブ内の各イベントを区別するのですか? – James

-2

これは慎重なアプローチであるようです。 1つに少しだけ違うものがあれば、修正する方が簡単です。ただ今は同じものだから...

Private Sub btnRightPos_Click(sender As Object, _ 
           ByVal e As System.EventArgs) _ 
          Handles btnRightPos.Click 
    btnRightPosCommon(sender, e, "C") 
End Sub 

Private Sub btnRightPos_MouseDown(ByVal sender As System.Object, _ 
            ByVal e As System.Windows.Forms.MouseEventArgs) _ 
           Handles btnRightPos.MouseDown 
    btnRightPosCommon(sender, e, "D") 
End Sub 

Private Sub btnRightPos_MouseUp(ByVal sender As System.Object, _ 
           ByVal e As System.Windows.Forms.MouseEventArgs) _ 
          Handles btnRightPos.MouseUp 
    btnRightPosCommon(sender, e, "U") 
End Sub 

'common 
Private Sub btnRightPosCommon(ByVal sender As System.Object, _ 
           ByVal e As System.Object, Optional id As String = "") 

    Debug.WriteLine("{0} {1} {2}", sender.GetType, e.GetType, id) 
End Sub 
+0

コメントを投稿するには投票を中止してください。 – dbasnett

+0

これは問題なく動作しますが、3つのイベントステートメントを1つのイベントステートメントに取り除くことで、コード内で何をしようとしているのかがわかりません。これは、コードを減らすのではなく、コードを長くします。 – James

+0

すでに言いましたが、「私は議員については気にしませんが、あなたはサブを宣言する方法を理解していますが、どのようにサブの内部の各イベントを区別するのですか...」 if then elseif then statementsで構成されます。だから、1行または2行のコードを保存するかもしれませんが、Clickイベントのコードを探す次の人が来るとどうなりますか?人がフォーム上のボタンをダブルクリックし、その結果の「新規」イベントハンドラのコードを追加するとどうなりますか?たぶんあなたは私にもう一度投票しますが、あなたは物事を良くしていません。 – dbasnett

関連する問題