在按钮点击中添加自定义参数的位置在哪里?

时间:2014-03-21 10:19:34

标签: c# events delegates eventargs

这似乎是一个简单的问题......关键是如何将按钮委托签名void, object, eventargs与我的方法匹配或使用事件委托。

作为一个例子,我有一个按钮的代码,当它被点击时会改变颜色。但是,

button1.Click += new EventHandler(KK.ChangeColor);

将EventArgs从按钮传递到ChangeColor(对象发送者,EventArgs e)方法,但对使用ColorEventArgs的其余代码没有意义;和

button1.Click += delegate(object sender, EventArgs e){ KK.ChangeColor(sender); };

不允许稍后在代码中删除委托。

哪个更好?在我的所有方法中添加不必要的参数以匹配按钮委托或者以后无法删除委托?

或如何更改按钮的代理签名? 似乎必须采用“更清洁”的方式来做到这一点?

欣赏建议。

1 个答案:

答案 0 :(得分:0)

  

" 似乎必须有一个更清洁的'这样做的方法?"

在我看来,更好的设计取决于ChangeColor方法的确切做法。如果它只执行与单击事件按钮密切相关的特定操作,我将其保留为真正的事件处理程序方法。这意味着,它应该具有匹配Button.Click事件处理程序签名所需的参数(我不认为有&#34的选项;更改委托签名") :

void ChangeColor(object sender, EventArgs e)
{
    MessageBox.Show("Button {0} clicked!!!", ((Button)sender).Name);
}

否则,如果点击事件按钮的不仅特定操作,我会将与按钮点击事件无关的代码重构为另一种方法。这样,另一种方法不需要具有不必要的参数。例如:

void ChangeColor(object sender, EventArgs e)
{
    var buttonName = ((Button)sender).Name;
    MessageBox.Show("Button {0} clicked!!! Save form data", );
    //assume that form name can be determined from name of button being clicked
    SaveFormToDatabase(buttonName);
}

private void SaveFormToDatabase(string formName)
{
    //save form specified in parameter
}