2012-08-23 50 views
3

我正在使用Windows Forms TreeView控件。TreeView多次触发BeforeSelect事件

我有它挂接的方式是为随后(简化):

TreeView treeView = new TreeView(); 

treeView.BeforeSelect += beforeSelect; 

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

    // more code 
} 

在某些情况下,呼叫到MessageBox.Show触发BeforeSelect事件的另一个饲养,这触发另一个,另一个,...

似乎这个事件是在树视图中的每个项目提高(我已经计算了它被提出的次数)。

我在互联网上搜索了更多关于这种情况的原因。

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

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

回答

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事件在默认情况下未被多次触发。

当您选择一个节点时,您将显示一个中断选择事件或任务的对话框(此处为消息框),但在关闭对话框后,选择事件将根据中断再次触发。您应该使用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); 
} 
+5

我的验证需要一个MessageBox(你想保存待处理的更改消息) –

-2

当你定义一个对象,你应该这样写这个;

真写:

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

从而将创建只有一个对象。