C# 防止触发自定义控件事件

C# 防止触发自定义控件事件,c#,winforms,events,treeview,controls,C#,Winforms,Events,Treeview,Controls,我有一个从继承的自定义控件。在这个CustomTreeView中,我处理了OnNodeMouseClick事件,以在更改节点之前执行一些过程。选中了用户期望的状态: public class CustomTreeView : TreeView { // Constructor... protected override void OnNodeMouseClick(TreeNodeMouseClickEventArgs e) { base.OnNodeMouseCl

我有一个从继承的自定义控件。在这个
CustomTreeView
中,我处理了
OnNodeMouseClick
事件,以在更改
节点之前执行一些过程。选中了用户期望的
状态:

public class CustomTreeView : TreeView {
    // Constructor...

    protected override void OnNodeMouseClick(TreeNodeMouseClickEventArgs e) {
       base.OnNodeMouseClick(e);

       // Do something...

       e.Node.Checked = !e.Node.Checked;
    }
}
我的问题是,当开发人员在
CustomTreeView
上订阅
AfterCheck
事件时,
e.Action
的值始终是(因为节点的选中状态在代码中发生了更改),而开发人员正在等待
treevaction。通过鼠标

public partial class Form1: Form {
    private void customTreeView1_AfterCheck(object sender, TreeViewEventArgs e) {
        // e.Action == TreeViewAction.Unknown
        // [developer] The user clicked on the node, it should be 
        //             TreeViewAction.ByMouse!?
    }
}
我想做的是禁用
AfterCheck
事件的触发,并在我的
CustomTreeView
类中自己调用它,这样我就能够通过
treevaction
传递参数,其值等于
ByMouse
。诸如此类:

public class CustomTreeView : TreeView {
    // Constructor...

    protected override void OnNodeMouseClick(TreeNodeMouseClickEventArgs e) {
       base.OnNodeMouseClick(e);

       // Do something...

       // Prevent all AfterCheck events from firing, just for a moment
       // ??

       e.Node.Checked = !e.Node.Checked;

       // Allow AfterCheck events to fire
       // ??

       // Call myself the AfterCheck event
       base.OnAfterCheck(new TreeViewEventArgs(e.Node, TreeViewAction.ByMouse));
    }
}

这可能吗?

当然可以,只需在
CustomTreeView
中的检查后覆盖
on,它就会按照您的意愿工作

public class CustomTreeView : TreeView {

    protected override void OnNodeMouseClick(TreeNodeMouseClickEventArgs e) {
       base.OnNodeMouseClick(e);

       // your stuff

       // Call myself the AfterCheck event
       base.OnAfterCheck(new TreeViewEventArgs(e.Node, TreeViewAction.ByMouse));
    }

    protected override void OnAfterCheck(TreeViewEventArgs e)
    {
       // do nothing   
    }
}


当然,只需在
CustomTreeView
中的检查后覆盖
,它就会按照您的意愿工作

public class CustomTreeView : TreeView {

    protected override void OnNodeMouseClick(TreeNodeMouseClickEventArgs e) {
       base.OnNodeMouseClick(e);

       // your stuff

       // Call myself the AfterCheck event
       base.OnAfterCheck(new TreeViewEventArgs(e.Node, TreeViewAction.ByMouse));
    }

    protected override void OnAfterCheck(TreeViewEventArgs e)
    {
       // do nothing   
    }
}