0

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

例如,我有一个按钮的代码,当它被点击时会改变颜色。然而,

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

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

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

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

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

或者我将如何更改按钮的代表签名? 似乎必须有一种“更清洁”的方式来做到这一点?

将不胜感激建议。

4

1 回答 1

0

看来必须有一种‘更清洁’的方式来做到这一点?

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

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
}
于 2014-03-21T14:16:50.340 回答