【问题标题】:TreeView fires the BeforeSelect event multiple timesTreeView 多次触发 BeforeSelect 事件
【发布时间】:2012-08-23 07:22:22
【问题描述】:

我正在使用Windows Forms 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 错误,因为这似乎是一种非常奇怪的行为,与我认为控件的工作方式不一致。

【问题讨论】:

    标签: c# .net winforms treeview


    【解决方案1】:

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

    private bool _inside;
    
    private void beforeSelect( object sender, EventArgs args )
    {
        if ( !_inside )
        {
            _inside = true;
    
            MessageBox.Show("Some msg");
    
            // more code
    
            _inside = false;
        }
    }
    

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

    【讨论】:

    • 我做了类似的事情(在进入方法时从事件处理程序中取消挂钩,稍后重新添加)。
    【解决方案2】:

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

    【讨论】:

    • 我的验证需要一个 MessageBox(您要保存待处理的更改消息)
    【解决方案3】:

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

    真写:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-10
      • 2012-08-21
      • 1970-01-01
      • 2016-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多