Как создать 5 кнопок и динамически назначать отдельные события кликов?

Мне нужно динамически создать 5 кнопок в форме окна, и каждая кнопка должна реагировать на событие щелчка. Я пробовал, но все кнопки реагируют на одно и то же событие.


person Raj    schedule 16.09.2009    source источник
comment
Покажите нам, что вы уже пробовали.   -  person dtb    schedule 16.09.2009
comment
Кнопки не реагируют на события.   -  person Henk Holterman    schedule 16.09.2009


Ответы (4)


Это то, о чем говорит Ник, это ваши два варианта (вы должны иметь возможность запустить этот код и увидеть оба варианта):

  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;
           // ...
        }
     }
  }
person SwDevMan81    schedule 16.09.2009
comment
Будут ли эти кнопки реагировать на события щелчка, например, когда я нажимаю кнопку 1, сообщение должно отображать «Кнопка 1 нажата», при нажатии кнопки 2 должно отображаться «Кнопка 2 нажата». и так далее... - person Raj; 17.09.2009
comment
Они определенно будут, продолжайте и протестируйте его, поставив точки останова или добавив MessageBox.Show (добавьте мои комментарии здесь); чтобы увидеть, как это работает. - person SwDevMan81; 17.09.2009

Я предполагаю, что вы находитесь в цикле и делаете что-то вроде этого?

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

Вы регистрируете один и тот же метод для всех кнопок. Вам понадобятся отдельные методы для каждой кнопки. Кроме того, вы можете назначить каждой кнопке отдельное идентифицирующее свойство и в своем обработчике проверить, какая кнопка была отправителем.

Оттуда вы можете предпринять соответствующие действия.

person Nick    schedule 16.09.2009

Угадайте, что вы, возможно, пробовали: да, все кнопки запускают свои события в один и тот же метод, но параметр sender вашего метода обратного вызова содержит ссылку на кнопку, которая фактически вызвала конкретное событие.

person Dario    schedule 16.09.2009

person    schedule
comment
И как это решает проблему? - person Moumit; 27.03.2016