5

私は、クリックされたときに同様のアクションを実行する必要がある多くのボタンを備えたプログラムを開発していますが、どのボタンがクリックされたかによってわずかな違いがあります。問題は、ボタンごとにこれをコーディングすることだけが簡単な方法であるということです。これは非常に反復的な作業になります。任意のボタンをクリックし、どのボタンがクリックされたかを1つのブロックでプログラムする方法はありますか?

4

4 に答える 4

14

すべてのボタンに同じイベントハンドラーを割り当てます。

foreach (var button in Controls.OfType<Button>()) {
    button.Click += button_Click;
}

または、イベントに切り替えられたプロパティウィンドウ(点滅アイコン)で同じイベントハンドラーを選択できます。


private static void button_Click(object sender, EventArgs eventArgs)
{
    switch (((Button)sender).Name)
    {
        // find a way to disambiguate.
    }
}

Tag曖昧性解消のために、プロパティにいくつかの有用な情報を追加することもできます。最後になりましたが、独自のボタンを派生させてButton、適切なプロパティを追加することができます。それらはプロパティウィンドウにも表示されます。

于 2012-09-23T17:13:39.233 に答える
7

ボタンの1つをダブルクリックして、ボタンクリックハンドラーを作成します。ただし、他のボタンで同じことを行う代わりに、プロパティウィンドウに移動して、イベントビューに切り替えます。次に、残りのボタンを1つずつ順番に選択Clickし、プロパティウィンドウの他のボタンのイベントのドロップダウンリストから、作成したばかりのクリックハンドラーを選択します。これで、クリックするとすべて同じメソッドがトリガーされます。

ここに画像の説明を入力してください

private void button1_Click(object sender, EventArgs e)
{
    var btn = (Button)sender;
    switch (btn.Name) {
        case "button1":
            ...
            break;
        case "button2":
            ...
            break;
        case "button3":
            ...
            break;
        default:
            break;
    }
}

または、プロパティウィンドウでボタンのプロパティの値を定義しTag、switchステートメントまたはifステートメントを使用せずに直接使用することもできます。

を使用して特定のボタンを直接テストすることもできますsender == button1が、これはswitchステートメントでは機能しません。


派生した独自のボタンを作成しButton、必要なプロパティを追加する方が簡単な場合があります。コンパイルすると、ボタンがツールボックスに表示され、プロパティウィンドウでプロパティを設定できます。

public class MyButton : Button
{
    public int A { get; set; }
    public int B { get; set; }
}

使用法:

private void button1_Click(object sender, EventArgs e)
{
    var btn = (MyButton)sender;
    DoSomething(btn.A, btn.B);
}
于 2012-09-23T17:21:44.153 に答える
3

任意のボタンをクリックし、どのボタンがクリックされたかを1つのブロックでプログラムする方法はありますか?

同じクリックイベントを使用して、ボタンがクリックされた送信者を条件付きで確認します

private void button1_Click(object sender, System.EventArgs e)
{
   if(sender == button1)
   {
      //do something different for button1
   }
   else if(sender == button2)
   {
      ....
   }
}

またはswitchステートメント。

于 2012-09-23T17:21:46.793 に答える
1

はい、ボタンクリックイベントハンドラーを1つだけ作成し、VisualStudioDesignerを使用してすべてのボタンに接続できます。

簡単です。次の手順に従ってください。

1)任意のボタンをダブルクリックして、任意の1つのボタンのbtn_clickイベントハンドラーを作成します。2)他のすべてのボタンについては、任意のボタンを右クリックし、プロパティをクリックしてイベントに移動し、[クリック]イベントで、ドロップダウンリストからbtn_clickを選択します。

同じイベントハンドラーの異なるボタンで異なる機能が必要な場合は、送信者パラメーターをボタンタイプにダウンキャストし、そのNameプロパティを使用してボタンを区別できます。

次に例を示します。

private void btn_Click(object sender, System.EventArgs e)
{
   Button b =(Button)sender;
   if(b.Name == "button1")
   {
      //some code
   }
   else if(b.Name == "button2")
   {
      ....
   }
}
于 2012-09-23T17:32:11.523 に答える