web-dev-qa-db-ja.com

5つのボタンを作成し、個々のクリックイベントを動的に割り当てるにはどうすればよいですか?

Windowsフォームに動的に5つのボタンを作成する必要があり、各ボタンはクリックイベントに応答する必要があります。試しましたが、すべてのボタンが同じイベントに応答しています。

11
Rajkishor Sahu

これはニックが話していることですあなたの2つのオプションです(このコードを実行して両方のオプションを見ることができるはずです):

  public Form1()
  {
     InitializeComponent();

     for (int i = 0; i < 5; i++)
     {
        Button button = new Button();
        button.Location = new Point(20, 30 * i + 10);
        switch (i)
        {
           case 0:
              button.Click += new EventHandler(ButtonClick);
              break;
           case 1:
              button.Click += new EventHandler(ButtonClick2);
              break;
           //...
        }
        this.Controls.Add(button);
     }

     for (int i = 0; i < 5; i++)
     {
        Button button = new Button();
        button.Location = new Point(160, 30 * i + 10);
        button.Click += new EventHandler(ButtonClickOneEvent);
        button.Tag = i;
        this.Controls.Add(button);
     }
  }

  void ButtonClick(object sender, EventArgs e)
  {
     // First Button Clicked
  }
  void ButtonClick2(object sender, EventArgs e)
  {
     // Second Button Clicked
  }

  void ButtonClickOneEvent(object sender, EventArgs e)
  {
     Button button = sender as Button;
     if (button != null)
     {
        // now you know the button that was clicked
        switch ((int)button.Tag)
        {
           case 0:
              // First Button Clicked
              break;
           case 1:
              // Second Button Clicked
              break;
           // ...
        }
     }
  }
34
SwDevMan81

私はあなたがループに入っていると思います、そしてこのようなことをしますか?

Button newButton = new Button();
newButton.Click += new EventHandler(newButton_Clicked);

すべてのボタンに同じメソッドを登録しています。ボタンごとに個別のメソッドが必要になります。または、各ボタンに異なる識別プロパティを割り当て、ハンドラーで、どのボタンが送信者であるかを確認することもできます。

そこから、適切なアクションを実行できます。

8
Nick

何を試したかを推測する:はい、すべてのボタンは同じメソッドに対してイベントを発生させますが、コールバックメソッドのsender-パラメーターには、特定のイベントを実際に引き起こしたボタンへの参照が含まれています。

4
Dario