Member 12370240 Ответов: 7

Как избежать повторения кода?


У меня есть кнопка 20 на winform. При каждом нажатии кнопки я хочу выполнить один и тот же код. Мне нужно только передать уникальное значение (в моем случае я использую поле тега) от каждой кнопки, чтобы узнать, какая кнопка была нажата (т. е. MessageBox.Кнопка Показать (.Бирка.Метод toString()). Это конкретное значение тега должно быть передано в код, который я могу использовать для каждого нажатия кнопки.
Как я могу сделать это легко, не написав один и тот же код для каждого события button_click?
Есть ли доступный пример, который показывает решение?

Что я уже пробовал:

Теперь я использую один и тот же код для каждой кнопки.

7 Ответов

Рейтинг:
56

RickZeeland

Вы можете сделать что-то вроде этого:

button1.Click += new EventHandler(Button_Click);
button2.Click += new EventHandler(Button_Click);
button3.Click += new EventHandler(Button_Click);

public void Button_Click(object sender, EventArgs e)
{
  Button btn = (Button)sender;
  if (btn.Tag == null) return;
  
  if (btn.Tag.equals("button1"))
  {
    // Do something
  }
}


Рейтинг:
50

Richard MacCutchan

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


Рейтинг:
5

Member 12370240

Я использовал следующий код для решения этой проблемы:
Я использую публичную функцию, которая вызывается из события button_click.

public void btnclick(int i)
{
//код для выполнения, в котором я использую переменную i, потому что мне нужно изменить таблицу данных на
//конкретные строки. Каждая строка совпадает с одной кнопкой, поэтому мне нужен правильный номер.
}


частный недействительными обработчика button1_click(объект отправителя, EventArgs в электронной)
{
btnclick(1);
}

private void button2_Click(object sender, EventArgs e)
{
    btnclick(2);
}

And so on for every button.


CHill60

Однако решение 1 гораздо лучше

Рейтинг:
44

lmoelleb

Наведите обработчик щелчка кнопки на тот же метод.
Visual studio помогает создать новый обработчик, но также позволяет выбрать существующий.

Или вы можете сделать это с помощью кода, если вам лень. Хорошие программисты достаточно ленивы, чтобы потратить 4 часа на Программирование решения глупой повторяющейся задачи, которая заняла бы 10 минут, чтобы сделать это вручную :)


Рейтинг:
36

Pawel Wzietek

Если у вас так много кнопок и вы хотите, чтобы обработчик быстро получал количество нажатых кнопок, то может быть проще создать массив кнопок. VB.NET не предоставляет языковой функции для этого (например, VB6), но это легко сделать вручную. В форме объявить

Button  btnarray[];

и привяжите элементы массива к вашим кнопкам в методе Form_Load:
btnarray=new Button[20];
btnarray[0]=Button1;
btnarray[1]=Button2;
...

Затем обработчик может просто искать в массиве соответствующий индекс:
int idx;
for(idx=0; idx<btnarray.Length(); idx++)
 if (sender.Equals(this.btnarray[idx]))  {break;}


Рейтинг:
27

phil.o

Вы можете назначить один и тот же обработчик событий (метод) для всех ваших кнопок.
То Click обработчик событий обычно определяется как

void button_Click(object sender, ClickEventArgs e)
{
   if (sender.Equals(this.button1))
   {
      // button1 was pressed
   }
   else if (sender.Equals(this.button2))
   {
      // button2 was pressed
   }
   // ...
   // Assuming here your buttons are named button1 .. button20.
}

В конструкторе просто назначьте один метод Click событие всех кнопок.


Рейтинг:
12

Dylvh

Подключитесь к событию single click, как упоминалось в предыдущих решениях, а затем попробуйте сделать что-то вроде следующего

void button_Click(object sender, ClickEventArgs e)
{
    MessageBox.Show(((Button)sender).Tag.ToString());
}