C# TreeView多次触发BeforeSelect事件
我正在使用控件 我将其连接的方式如下(简化): 在某些情况下,调用MessageBox.Show会触发另一次引发BeforeSelect事件,这会触发另一次,另一次 在树视图中,似乎每个项目都会引发此事件(我已经计算了引发的次数) 我在互联网上搜索了更多的信息,以了解为什么会发生这种情况 我发现TreeView在获得焦点时会自动选择第一个节点。 但是,这并不能解释为什么事件是按树中treenode项的数量触发的C# TreeView多次触发BeforeSelect事件,c#,.net,winforms,treeview,C#,.net,Winforms,Treeview,我正在使用控件 我将其连接的方式如下(简化): 在某些情况下,调用MessageBox.Show会触发另一次引发BeforeSelect事件,这会触发另一次,另一次 在树视图中,似乎每个项目都会引发此事件(我已经计算了引发的次数) 我在互联网上搜索了更多的信息,以了解为什么会发生这种情况 我发现TreeView在获得焦点时会自动选择第一个节点。 但是,这并不能解释为什么事件是按树中treenode项的数量触发的 在此方面如有任何帮助,将不胜感激。我正在考虑为此提出一个Microsoft Conn
在此方面如有任何帮助,将不胜感激。我正在考虑为此提出一个Microsoft Connect错误,因为这似乎是一个非常奇怪的行为,与我认为控件的工作方式不一致。像下面这样简单地阻止自己就足够了吗
private bool _inside;
private void beforeSelect( object sender, EventArgs args )
{
if ( !_inside )
{
_inside = true;
MessageBox.Show("Some msg");
// more code
_inside = false;
}
}
这将不允许对函数进行“递归”调用。默认情况下不会多次触发该事件
选择节点时,会显示一个对话框(此处为messagebox),该对话框会中断选择事件或任务,但在关闭对话框后,选择事件会根据中断再次激发。您应该使用treeview事件来做一些事情。。。并且仅用于验证
请查看此代码-运行它
void treeView1_BeforeSelect(object sender, TreeViewCancelEventArgs e)
{
e.Node.Tag = (int)(e.Node.Tag ?? 0) + 1;
int count = (int)(e.Node.Tag);
e.Node.Text = String.Format("selected {0} Count: {1}", e.Action.ToString(), count);
}
当你定义一个对象时,你应该这样写 真实写法:
private static TreeView projectagac;
...
...
...
projectagac = new TreeView();
因此,您将只创建一个对象。我做了类似的操作(在输入方法时从事件处理程序中取消挂钩,稍后重新添加)。我的验证需要一个MessageBox(是否保存挂起的更改消息)
private static TreeView projectagac;
...
...
...
projectagac = new TreeView();