Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# TreeView多次触发BeforeSelect事件_C#_.net_Winforms_Treeview - Fatal编程技术网

C# TreeView多次触发BeforeSelect事件

C# TreeView多次触发BeforeSelect事件,c#,.net,winforms,treeview,C#,.net,Winforms,Treeview,我正在使用控件 我将其连接的方式如下(简化): 在某些情况下,调用MessageBox.Show会触发另一次引发BeforeSelect事件,这会触发另一次,另一次 在树视图中,似乎每个项目都会引发此事件(我已经计算了引发的次数) 我在互联网上搜索了更多的信息,以了解为什么会发生这种情况 我发现TreeView在获得焦点时会自动选择第一个节点。 但是,这并不能解释为什么事件是按树中treenode项的数量触发的 在此方面如有任何帮助,将不胜感激。我正在考虑为此提出一个Microsoft Conn

我正在使用控件

我将其连接的方式如下(简化):

在某些情况下,调用MessageBox.Show会触发另一次引发BeforeSelect事件,这会触发另一次,另一次

在树视图中,似乎每个项目都会引发此事件(我已经计算了引发的次数)

我在互联网上搜索了更多的信息,以了解为什么会发生这种情况

我发现TreeView在获得焦点时会自动选择第一个节点。 但是,这并不能解释为什么事件是按树中treenode项的数量触发的


在此方面如有任何帮助,将不胜感激。我正在考虑为此提出一个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();