Событие для нажатия на любую кнопку (C# windows forms)


Я разрабатываю программу, которая имеет много кнопок, которые должны выполнять аналогичное действие при нажатии, но с небольшой разницей, основанной на том, какая кнопка была нажата. Проблема в том, что единственный прямой путь-это кодировать это для каждой кнопки, что было бы очень повторяющейся задачей. Есть ли способ запрограммировать просто один блок, который получил бы щелчок по любой кнопке, и какая кнопка была нажата?

4 4

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")
   {
      ....
   }
}