TreeView多次触发BeforeSelect事件

时间:2012-08-23 07:22:23

标签: c# .net winforms treeview

我正在使用Windows Forms TreeView控件。

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

TreeView treeView = new TreeView();

treeView.BeforeSelect += beforeSelect;

private void beforeSelect(sender, args)
{
     MessageBox.Show("Some msg");

     // more code
}

在某些情况下,对 MessageBox.Show 的调用会触发 BeforeSelect 事件的另一次提升,触发另一个,另一个......

看来这个事件在树视图中被提升为PER ITEM(我已经计算了它被提升的次数)。

我已经在互联网上搜索了更多关于为什么会发生这种情况的信息。

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

任何帮助将不胜感激。我正在考虑为此提出一个Microsoft Connect错误,因为它看起来像一个非常奇怪的行为,与我认为控件应该如何工作不一致。

3 个答案:

答案 0 :(得分:3)

仅仅像以下一样阻止自己就足够了吗?

private bool _inside;

private void beforeSelect( object sender, EventArgs args )
{
    if ( !_inside )
    {
        _inside = true;

        MessageBox.Show("Some msg");

        // more code

        _inside = false;
    }
}

这将禁止对您的函数进行“递归”调用。

答案 1 :(得分:3)

默认情况下,BeforeSelect事件未多次触发。

当您选择节点时,会显示一个对话框(此处为messagebox),该对话框会中断选择事件或任务,然后在关闭对话框后,选择事件将根据中断再次触发。您应该使用树视图的AfterSelect事件来执行操作... BeforeSelect仅用于验证..

请查看此代码 - 运行它

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

答案 2 :(得分:-2)

定义对象时,应该这样写;

真写:

private static TreeView projectagac; 
...
...
...
projectagac = new TreeView();

因此你只会创建一个对象。