我有ComboBox,每个都有SelectedIndexChanged事件。 我不想编写每个ComboBox的事件,但我想编写一个事件方法来检查哪个ComboBox调用事件并让控件为每个Combobox执行特定的方法。 我搜索并写了这样的文字:
private void eventmethod(object sender, EventArgs s)
{
ComboBox cb = sender as ComboBox;
if (cb != null & cb.Name.Equals("combobox1"))
{
method1();
}
else if (cb != null & cb.Name.Equals("combobox2"))
{
method2();
}
}
有更有效的检查方法吗?
答案 0 :(得分:4)
此方法会违反Single Responsibility Principle (SRP),除非每个ComboBox.SelectedIndexChanged Event执行相同操作。
最好为每个控件都有一个事件处理程序,以便可以轻松分离特定的行为。如果为每个ComboBox指定了特定行为,并且它们也有一个共同的行为,那么使用辅助方法执行常见任务。
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) {
doesCommonTasksToBePerformedThroughAHelperMethod();
}
private void comboBox2_SelectedIndexChanged(object sender, EventArgs e) {
// Does specific tasks
doesCommonTasksToBePerformedThroughAHelperMethod();
}
private void doesCommonTasksToBePerformedThroughAHelperMethod() {
// Perform common tasks
}
这是首选的做法。
否则,检查控件本身。
var cb = sender as ComboBox;
if (cb == null) return;
switch(cb) {
case cb.Equals(comboBox1):
// Do something
break;
case cb.Equals(comboBox2):
// Do something
break;
}
切换语句很少是好事。以下是该主题的一些链接。
答案 1 :(得分:1)
更好的做法是为每个控件添加单独的事件处理程序,然后让它们在执行相同操作时调用相同的方法:
void combo1_OnChange(object sender, EventArgs e)
{
CommonMethod();
}
void combo2_OnChange(object sender, EventArgs e)
{
CommonMethod();
}
在你的情况下,他们不会做同样的事情,所以拥有单独的处理程序更有意义:
void combo1_OnChange(object sender, EventArgs e)
{
Method1();
}
void combo2_OnChange(object sender, EventArgs e)
{
Method2();
}
此规则的一个例外是,如果您即时创建控件,但即便如此,您可能会使用委托。
答案 2 :(得分:0)
您可以使用switch语句:
private void eventmethod(object sender, EventArgs s)
{
ComboBox cb = sender as ComboBox;
if (cb == null) return;
switch (cb.Name)
{
case "combobox1":
method1();
break;
case "combobox2":
method2();
break;
}
}
这不一定是执行此操作的最佳方式,但它确实消除了多次空检查的需要。
答案 3 :(得分:0)
无需多次检查null,只需执行一次并返回(如果找到)。也无需检查名称,因为您可以检查控件即组合框。因为你正在调用一种不同的方法,所以有多个控件指向这个事件是没有害处的。我也会用try catch语句包围它。
private void eventmethod(object sender, EventArgs s)
{
ComboBox cb = sender as ComboBox;
//check for null once and return if found
if(cb == null) return;
//no need to call for the name just check for the combobox
//assuming the name of the control is combobox1 and combobox2
if (cb.Equals(combobox1))
{
method1();
}
else if (cb.Equals(combobox2))
{
method2();
}
}