代码之家  ›  专栏  ›  技术社区  ›  sharkin

我可以更改设计器将事件添加到哪个类吗?

  •  0
  • sharkin  · 技术社区  · 15 年前

    我有自己的自定义控件 system.windows.forms.treeview系统 它出现在设计器工具箱中。

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

    我创建继承控件的目的是让控件本身处理其事件,因为它应该充当 视图 在标准的mvc设计中。即,当TreeView中的节点选择更改时,我希望视图处理与 模型

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

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

    谢谢。

    2 回复  |  直到 15 年前
        1
  •  1
  •   sharkin    15 年前

    汤姆·弗雷是对的。如果希望某个事件上的行为由通常触发该事件的类处理,则首选技术是重写触发该事件以执行任务的相应方法。事件基础设施是过度杀伤力的,并不是真正为您在这里要做的而设计的。

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

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

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

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

    MSDN :

    这个 OnNodeMouseClick 方法也 允许派生类处理 不附加委托的事件。 这是在派生的 班级。

    继承人须知:

    重写时 onnodemouseclick 在里面 派生类,请确保调用 基类 onnodemouseclick 方法 以便注册代表收到 事件。

        2
  •  2
  •   TJF    15 年前

    为什么不重写派生类中的一些方法,例如:

    protected override void OnNodeMouseClick(TreeNodeMouseClickEventArgs e)
        {
        }