3

我正在使用Windows 窗体TreeView控件。

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

TreeView treeView = new TreeView();

treeView.BeforeSelect += beforeSelect;

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

     // more code
}

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

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

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

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

任何帮助将不胜感激。我正在考虑为此提出一个 Microsoft Connect 错误,因为这似乎是一种非常奇怪的行为,与我认为控件的工作方式不一致。

4

3 回答 3

3

像下面这样简单地阻止自己就足够了吗?

private bool _inside;

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

        MessageBox.Show("Some msg");

        // more code

        _inside = false;
    }
}

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

于 2012-08-23T07:44:46.603 回答
3

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

当您选择一个节点时,您会显示一个对话框(此处为消息框),该对话框会中断选择事件或任务,但是在您关闭对话框后,选择事件会根据中断再次触发。您应该使用Treeview 的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);
 }
于 2012-08-23T07:51:47.867 回答
-2

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

真写:

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

因此您将只创建一个对象。

于 2014-04-26T09:16:48.513 回答