调用设计器构建的事件处理程序

时间:2011-11-07 17:24:38

标签: c# .net

我目前的任务是清理,修复错误并优化winforms中的表单(一个.cs文件中的3000行代码,这有点难看!)。我已经注意到了一些明显的不良做法和一些冗余的电话,我可以相对轻松地解决这个问题。

然而,有一个出现了很多,在我看来似乎是不好的做法,但我实际上无法用任何文档备份它。我可能完全错了。

private void datePicker_DateChanged(object sender, EventArgs e)
{
  tabControl_SelectedIndexChanged(sender, e);
}

private void comboBox_SelectedIndexChanged(object sender, EventArgs e)
{
  tabControl_SelectedIndexChanged(sender, e);
}

我首先关注的是该方法将具有sender对象,即日期选择器或组合框,但这有关系吗?我问自己,那里的发件人对象是什么?也许这就是为什么它在那里?我发现EventArgs本身对我来说是非常无用的(我知道),除非该类是继承的。

我知道sender方法中没有使用EventArgstabControl_SelectedIndexChanged,因此代码运行正常。当一些代码被更改时,未来可能会有什么影响呢?

我应该将这些更改为3个不同的事件处理程序,这些处理程序都指向一个简单的void loadCurrentTab()方法吗?或许我应该让所有3个控件调用相同的事件处理程序,例如loadCurrentTab(sender, e)?或者只是保持原样?这很重要吗?

5 个答案:

答案 0 :(得分:3)

  

我应该将这些更改为3个不同的事件处理程序,这些处理程序都指向一个简单的void loadCurrentTab()方法吗?

在这种情况下,这实际上是我的偏好。这使得意图非常清晰 - 所有三个事件处理程序都路由到一组逻辑,这些逻辑(按设计)不关注发件人或EventArgs

答案 1 :(得分:2)

调用事件处理程序的最大问题(除了它是糟糕的做法)是当你快速浏览一下调用堆栈时,在你的情况下,你会看到选项卡的选定索引在没有的情况下发生变化实际上发生了。

在方法调用中没有未使用的参数也是一种好习惯。有一些例外(一个事件处理),但对于写的任何代码,我尽量确保我总是使用我提供的。

答案 2 :(得分:2)

首先,它并不是那么重要。考虑不修复未破坏的东西。

首选方法是让几个处理程序都调用一个特殊方法(而不是一个事件处理程序)。

private void datePicker_DateChanged(object sender, EventArgs e)
{
   // tabControl_SelectedIndexChanged(sender, e);
   RefreshCurrentTabControl();
}

答案 3 :(得分:0)

调用其他EventHandler显然不是很好的实践。如果tabControl_SelectedIndexChanged时间发生变化并且开始取决于发件人,那么所有代码​​都会失败或明星工作未成功..

我会像你说的那样在第三种方法中分离相同的逻辑。loadCurrentTab()。您还可以考虑使用一些命令模式来处理事件 - >将业务逻辑与GUI分离的好方法。

例如:

interface ICommand {
    void Execute();
}

interface IEventCommand : ICommand {
    void Execute(object sender, EventArgs e); 
}


class CommandAttribute : Attribute {
     ...
}

class MyCommand : IEventCommand {
     ...
}

实现一些管理器,执行器,使用反射附加命令等...

然后你可以附上这样的命令:

[Command(typeof(MyCommand), new [] {"Click"})]
private Button m_oButton = new Button();

所有nessesary参数都是自动神奇的;)传递给命令。

答案 4 :(得分:0)

是的,这是不好的做法,你在一个人中挣扎,在无知中打破另一个,经典错误就像((ComboBox)发送者).SomeProperty一样简单,因为“它只能从Combobox调用”。

取决于你能承受多大程度的重构,但我的即时反应至少是“RefreshTabControl”才能完成工作,然后让eventHandlers调用它。如果你必须对此进行扩展,即Sender或EventArgs很重要,那么建议的某种形式的委托,或者不如你所拥有的聪明但更好,将是一种过载。

e.g void RefreshTabControl(Combobox argBox,EventArgs e) 然后在事件处理程序中进行强制转换和空检查,至少这将是意图声明。

你现在所拥有的是一个等待发生的错误。