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
}
}