【发布时间】:2012-08-22 06:25:10
【问题描述】:
我有一个继承自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;
}
}
我的问题是,当开发人员订阅CustomTreeView 上的AfterCheck 事件时,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));
}
}
这可能吗?
【问题讨论】:
标签: c# winforms events treeview controls