C#.NET - 我可以更改设计器添加事件的类吗?

时间:2009-09-30 13:03:39

标签: c# events user-controls windows-forms-designer

我有自己的自定义控件派生自设计器工具箱中的 System.Windows.Forms.TreeView

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

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

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

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

感谢。

2 个答案:

答案 0 :(得分:2)

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

protected override void OnNodeMouseClick(TreeNodeMouseClickEventArgs e)
    {
    }

答案 1 :(得分:1)

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

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

但是,执行此类覆盖时要包含的一个重要事项是调用base的实现。如果不这样做,您可能会遇到奇怪的错误:

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方法   以便注册代表收到   事件。