Как сделать кнопки делать то же самое?
Я только начал программировать, и я хочу использовать 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.
Но постарайтесь не практиковать как таковой и просто просто поместите его в функцию/метод, как то, что предложил Дэвид.
Ответ 8
Ссылка на эту ссылку
http://dotnet-developerzone.blogspot.in/2014/06/create-own-button-click-event-in-cnet.html
Создайте события и свойства кнопки с помощью