Событие для нажатия на любую кнопку (C# windows forms)
Я разрабатываю программу, которая имеет много кнопок, которые должны выполнять аналогичное действие при нажатии, но с небольшой разницей, основанной на том, какая кнопка была нажата. Проблема в том, что единственный прямой путь-это кодировать это для каждой кнопки, что было бы очень повторяющейся задачей. Есть ли способ запрограммировать просто один блок, который получил бы щелчок по любой кнопке, и какая кнопка была нажата?
4 ответа:
Назначьте один и тот же обработчик событий для всех кнопок.
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
и добавить соответствующие свойства. Они даже появятся в окне свойств.
Создайте обработчик нажатия кнопки, дважды щелкнув одну из кнопок. Но вместо того, чтобы делать то же самое с другими кнопками, перейдите в окно свойств и переключитесь на представление событий. Теперь выделите каждую из оставшихся кнопок по очереди и выберите только что созданный обработчик щелчка из выпадающего списка события
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); }
Есть ли способ запрограммировать просто один блок, который получил бы щелчок по любой кнопке, и какая кнопка была нажата?
Я бы просто использовал то же событие click и условно проверил отправителя, для которого была нажата кнопка
private void button1_Click(object sender, System.EventArgs e) { if(sender == button1) { //do something different for button1 } else if(sender == button2) { .... } }
Или оператор switch..
Да вы можете создать только один обработчик событий нажатия кнопки и подключить его ко всем кнопкам с помощью visual studio designer.
Это просто, просто выполните следующие действия:
1) Создайте обработчик событий btn_click для любой кнопки, дважды щелкнув на любой кнопке. 2) для всех остальных кнопок щелкните правой кнопкой мыши на любой кнопке, выберите Свойства, перейдите к событиям, на событии "Click" выберите btn_click из выпадающего списка.
Если вы хотите разные функции в разных кнопках в одном и том же обработчик событий, вы можете понизить параметр sender до типа кнопки, а затем использовать его свойство 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") { .... } }