阻止自定义控件事件触发

时间:2012-08-22 06:25:11

标签: c# winforms events treeview controls

我有一个继承自TreeView的自定义控件。在这个CustomTreeView中,我处理OnNodeMouseClick事件以在更改node.Checked状态之前执行某个过程,如用户期望的那样:

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

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

       // Do something...

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

我的问题是,当开发人员在AfterCheck上订阅CustomTreeView事件时,e.Action的值始终为TreeViewAction.Unknown(因为节点的已检查状态为代码中已更改),而开发人员正在等待TreeViewAction.ByMouse

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课程中自行调用,这样我就可以传递TreeViewAction等于的参数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));
    }
}

这可能吗?

1 个答案:

答案 0 :(得分:1)

当然,只需覆盖OnAfterCheck中的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   
    }
}

enter image description here