0

我有自己的自定义控件,它来自设计器工具箱中的System.Windows.Forms.TreeView 。

我将这个自定义控件的一个实例添加到我的表单中(使用设计器)。

我创建继承控件的目的是让控件本身处理其事件,因为它应该充当标准 MVC 设计中的视图。即当树视图中的节点选择发生变化时,我希望视图处理与Model的所有交互。

问题是当我为我的自定义控件添加一个事件(使用设计器)时,该事件被添加到我的 MainForm 类中。在这种情况下,唯一的选择是将每个事件转发到我的自定义控件中,这感觉不是很理想。

有没有办法控制事件被添加到哪个类?我知道这在技术上是可行的,因为我可以为我的 MainForm 编辑自动生成的代码,并使事件被触发到自定义控件中。但这显然不是正确的解决方案。

谢谢。

4

2 回答 2

2

为什么不直接覆盖派生类中的一些方法,例如:

protected override void OnNodeMouseClick(TreeNodeMouseClickEventArgs e)
    {
    }
于 2009-09-30T13:12:37.457 回答
1

汤姆弗雷是对的。如果您希望某个事件的行为由通常会触发该事件的类处理,则首选技术是覆盖触发该事件以执行您的任务的适当方法。赛事基础设施是矫枉过正的,并不是真正为您在这里尝试做的事情而设计的。

原因是您希望视图的每个实例都执行这些操作。您不希望这些操作在运行时由视图外部的事物动态分配和确定(这就是事件的用途)。

但是,在执行此类覆盖时要包括的一件重要事情是对基实现的调用。如果不这样做,您可能会遇到奇怪的错误:

protected override void OnNodeMouseClick(TreeNodeMouseClickEventArgs e)
{
    // Do stuff you want done before here
    base.OnNodeMouseClick(e);
    // Do stuff you want done after here
}

调用基类将触发事件并可能执行其他操作。如果您想在事件触发之前完成某些事情并且任何外部订阅者都做他们的事情,请将其放在调用基地之前。如果你想在所有事件都被触发并被处理后完成一些事情,把它放在后面。人为的例子:如果您的控件处理了一些数据绑定,那么您可能希望在调用 base 之前验证数据绑定是否存在,并且您可能希望在之后验证它是否有效(以防处理程序修改某些内容)。

来自MSDN

OnNodeMouseClick方法还允许派生类在不附加委托的情况下处理事件。 这是在派生类中处理事件的首选技术。

继承人注意事项:

在派生类中重写OnNodeMouseClick时,请务必调用基类的OnNodeMouseClick方法,以便注册的委托接收事件。

于 2009-09-30T13:24:43.953 回答