Как сделать кнопки делать то же самое?

Я только начал программировать, и я хочу использовать WinForms для создания нескольких кнопок, на которые вы можете щелкнуть, чтобы перейти от белого к зеленому и к белому. Я сделал это для одной кнопки:

private void button1_Click(object sender, EventArgs e)
    {
        if (button1.BackColor != Color.Lime)
        {
            button1.BackColor = Color.Lime;
        }
        else
        {
            button1.BackColor = Color.White;
        }
    }

Теперь я мог бы скопировать и вставить это для всех кнопок, но я знаю, что это неэффективно; и если я использую winforms для ссылки button1 на button2, он просто изменит цвет кнопки1 (очевидно).

Итак, мне нужно использовать вспомогательный метод, новый класс или что-то еще? Как это выглядит?

Ответы

Ответ 1

Существует несколько подходов. Можно было бы создать общую функцию, которую вызывают разные кнопки:

private void button1_Click(object sender, EventArgs e)
{
    ChangeColor(button1);
}

private void ChangeColor(Button button)
{
    if (button.BackColor != Color.Lime)
        button.BackColor = Color.Lime;
    else
        button.BackColor = Color.White;
}

Тогда каждый обработчик кнопки может использовать тот же вызов функции.

Или, если все эти кнопки всегда будут делать одно и то же, тогда вы можете использовать одну функцию обработчика кликов для всех них. В этом случае вам нужно будет определить, какая кнопка вызывается обработчиком (в то время как вы прямо ссылаетесь на button1), чтобы вы знали, какой из них нужно изменить. Объект sender, переданный в функцию обработчика, фактически является ссылкой на элемент формы, который вызывает обработчик. Все, что вам нужно сделать, это бросить его:

private void button_Click(object sender, EventArgs e)
{
    var button = (Button)sender;
    if (button.BackColor != Color.Lime)
        button.BackColor = Color.Lime;
    else
        button.BackColor = Color.White;
}

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

Ответ 2

Вы делаете это точное так же, как и для любого класса С#. Вы получаете свой собственный класс и настраиваете поведение базового класса. Каждое событие имеет соответствующий метод OnXxxx(), который вы можете переопределить.

Добавьте новый класс в свой проект и вставьте этот код:

using System;
using System.Windows.Forms;

class MyButton : Button {
    protected override void OnClick(EventArgs e) {
        // Your code here
        //...
        base.OnClick(e);
    }
}

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

Ответ 3

Вероятно, самым простым способом было бы, чтобы каждая кнопка вызывала один и тот же обработчик кликов. Затем внутри вашего обработчика используйте Sender вместо жесткого кодирования Button1.

private void buttons_Click(object sender, EventArgs e)
    {
        var theButton = (Button) sender;
        if (theButton.BackColor != Color.Lime)
        {
            theButton.BackColor = Color.Lime;
        }
        else
        {
            theButton.BackColor = Color.White;
        }
    }

Ответ 4

Вы можете получить кнопку, которая подняла событие Click, нажав sender на Button.

Затем вы можете добавить один и тот же обработчик к каждой кнопке.

Ответ 5

Я парень VB.... в VB.Net вы можете добавить несколько обработчиков событий и подключить несколько событий к одному и тому же обработчику.

Подключает все клики, чтобы покрасить кнопки.

Private Sub ColorButtons(sender As System.Object, e As System.EventArgs) _
Handles Button1.Click, Button2.Click, ..

Я делаю это все время случайно, потому что я перетаскиваю/копирую элемент управления, чтобы создать новый, и новая кнопка добавляется к исходным событиям.

Другие Subs могут обрабатывать одни и те же события для выполнения другой работы - оба выполняются.

Не знаю, как это сделать на С#.

Ответ 6

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

MyButton1.Click += new RoutedEventHandler(buttons_Click);
MyButton2.Click += new RoutedEventHandler(buttons_Click);
etc...

Вы можете связать столько элементов управления с обработчиком событий, сколько захотите.

Ответ 7

То, что я обычно делаю раньше, следующее:

private void button2_Click(object sender, EventArgs e)
{
    button1.PerformClick();
}

Этот код просто запустит коды под кнопкой button1_Click.

Но постарайтесь не практиковать как таковой и просто просто поместите его в функцию/метод, как то, что предложил Дэвид.