我有一个继承自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));
}
}
这可能吗?
答案 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
}
}