检查哪个对象调用事件方法

时间:2014-09-05 16:19:27

标签: c# winforms

我有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();
    }
}

有更有效的检查方法吗?

4 个答案:

答案 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. How to explain why a developer should avoid case statements and create some new classes?
  2. Refactoring a Switch statement
  3. Switch Statements

答案 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();
    }
}