我正在使用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错误,因为它看起来像一个非常奇怪的行为,与我认为控件应该如何工作不一致。
答案 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();
因此你只会创建一个对象。