2013-07-19 3 views
15

Я только начал программировать, и я хочу использовать 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 (очевидно).

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

+13

реквизита к вам для не желающих принять легкий путь и вырезать и вставить много кода. Вы уже думали о правильном пути. –

ответ

24

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

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 в качестве обработчика щелчков для всех кнопок, которые должны вызывать это.

+0

Это именно то, что я искал. Спасибо всем вам за помощь, объяснения и добрые слова. – user2600871

+0

+1 Отличный ответ; очень хорошо объяснил. –

5

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

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

+2

Существует неявный «Иметь тот же метод, что и все события кнопок» здесь. Вы можете выбрать обработчик события элемента управления в визуальной студии, выбрав элемент управления, затем в окне свойств выберите «события» и прокрутите вниз, пока не найдете «Щелчок». Затем в раскрывающемся списке рядом с «Щелчком» вы можете выбрать метод, который вы хотите вызвать, когда произошло событие щелчка –

8

Возможно, самым простым способом было бы, чтобы каждая кнопка вызывала один и тот же обработчик кликов. Затем внутри вашего обработчика используйте 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; 
     } 
    } 
13

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

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

using System; 
using System.Windows.Forms; 

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

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

+0

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

+1

+1 Лучше, потому что это не * употребление * события 'Click', а просто построение поведения в самой кнопке. Это решение не связано с обработчиком событий и ставит код точно там, где он принадлежит. Является ли это излишним или нет, не имеет значения; объем написания кода по существу тот же, и он является многоразовым и поддерживаемым решением - будущее «я» никогда не спросит «где я снова закодировал поведение этой кнопки?» потому что, ну, код явно находится в классе * MyButton *. С любым другим решением *, если кнопка когда-либо понадобится повторно использовать в другом месте, возникает проблема *. –

+0

@retailcoder: нет, есть такая вещь, как overengineering. Это оно. Смотрите блог Джеффа Атвуда на сегодня, кстати: http://www.codinghorror.com/blog/2013/07/rule-of-three.html. Не тратьте время на чрезмерное повторное использование, пока оно вам не понадобится, особенно для этой явно тривиальной программы. – siride

0

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

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

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

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

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

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

+0

Это не отличается в C#. –

0

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

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

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

+0

Обратите внимание, что элемент 'RoutedEventHandler' является избыточным, потому что событие' Click' уже задает его, поэтому 'MyButton1.Click + = buttons_Click;' достаточно. –

0

То, что я обычно делаю, прежде чем это:

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

Этот код будет просто запустить коды под button1_Click.

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

0

См эту ссылку

http://dotnet-developerzone.blogspot.in/2014/06/create-own-button-click-event-in-cnet.html

кнопку Создать события и свойства с помощью него

+0

Ссылка только ответы не принимаются в SO, потому что ответ потеряет свое значение, если связанная страница станет недоступной. Пожалуйста, добавьте подробную информацию или образец кода к вашему ответу. – Harry

Смежные вопросы