Я возился с событиями, чтобы лучше понять их использование в очень общих ситуациях. Я с удивлением обнаружил следующее, так что я, вероятно, иду в неправильном направлении ... суть того, что я делаю, заключается в изменении цвета кнопки на случайный при нажатии:
Форма Windows
public Form1()
{
ColorChanges KK = new ColorChanges();
KK.ColorEventHandler += handle_ColorChanges;
button1.Click += delegate { KK.ChangeColor(button1); };
}
Класс события
class ColorChanges
{
*... properties & constructor*
public void ChangeColor(object sender)
{
*... randomly assign color to ColorEventArgs*
}
protected virtual void onColorEvent(object sender, ColorEventArgs e)
{
EventHandler<ColorEventArgs> ceh = ColorEventHandler;
{
if (ceh != null)
{
ceh(sender, e)
}
}
}
public event EventHandler<ColorEventArgs> ColorEventHandler;
}
Настраиваемые аргументы событий
public class ColorEventArgs : EventArgs
{
public Color xColor { get; set; }
}
Обработчик события
public void handle_ColorChanges(object sender, ColorEventArgs e)
{
if (sender is Button)
{
var ButtonSender = (Button)sender;
ButtonSender.BackColor = e.xColor;
}
}
Итак, отредактированные вопросы:
Полезно ли использование делегата EventHandler (TEventArgs)? В документации MS указано, что такой синтаксис, как
button1.Click += new EventHandler<AutoRndColorEventArgs>(handle_ColorChanges);
правильно, но это не дойдет до моего кода, чтобы случайным образом выбрать цвет и ошибку
«Нет перегрузки для 'handle_ColorChanges' соответствует делегату> 'System.EventHandler'»
так что-то вроде
button1.Click += new EventHandler<AutoRndColorEventArgs>(KK.ChangeColor(button1));
or
button1.Click += new EventHandler(KK.ChangeColor(button1));
Ошибка говорит о том, что требуется метод, и если я использую
«Нет перегрузки для 'handle_ColorChanges' соответствует делегату 'System.EventHandler'»
Лямбда-выражения помогают благодарим за вспомогательные ответы
button1.Click += (sender,args) => KK.ChangeColor(s);
Но это не позволяет отменить назначение, и это потребуется позже ...
У анонимного делегата такая же проблема
button1.Click += delegate(object sender, EventArgs e)
{ KK.ChangeColor(sender); };
Суть проблемы в том, что мои методы цвета или их делегаты не соответствуют подписи делегата кнопки (объект, событие). Меня не волнуют аргументы кнопок, и я хочу использовать свои собственные КАК?
new EventHandler
является необязательным, начиная с C # 2.0. - person CodesInChaos   schedule 19.03.2014