1

我有两个名为“mainForm”和“addRslt”的表单。这个想法是当用户单击 mainForm 中的按钮时,addRslt 表单将 Show(),然后用户将填充 TreeView。现在,当用户想要关闭此 addRslt 表单时,程序将改为Hide()表单(使用e.Cancel = true;),因此稍后如果用户重新打开此表单,他/她可以向 TreeView 添加更多内容。

在我的 mainForm 中,我有一个用于显示此 addRslt 表单的按钮,并且在此按钮的单击代码中,还有我的 FormClosing 委托,它将检测 addRslt 表单中的 TreeView 内容并将其复制到 mainForm 中的 TreeView。

现在的问题是我想检查重复的节点并且不要将它们添加到 mainForm 中的 TreeView。这是正确的,但我还有一个消息框,告诉用户程序没有添加现有节点!到目前为止还可以。但是问题是每次我这样做时,这个消息框都会出现 N+1 次!我的意思是如果我第一次这样做,这个消息框会出现 2 次等等......

这是我的代码!对不起,长篇大论!

    private void menuFileAddTestResults_Click(object sender, EventArgs e)
    {
        addRslt.Show();

        addRslt.FormClosing += delegate
        {
            foreach (TreeNode node in addRslt.treeViewSelectedFiles.Nodes)
            {
                TreeNode newNode = new TreeNode();
                newNode.Text = node.Text;
                newNode.Name = node.Name;
                newNode.Tag = node.Tag;

                if (!treeViewTestFiles.Nodes.ContainsKey(node.Name))
                {
                    treeViewTestFiles.Nodes.Add(newNode);
                }
                else
                {
                    countExist++;
                }
            }

            if (countExist > 0)
            {
                MessageBox.Show(countExist.ToString() + " Test files are already exist in the list!");
            }

            countExist = 0;
        };
    }
4

2 回答 2

1

FormClosing每次显示它时都会添加一个处理程序。只需添加一次,当您设置表单的其余部分时。(就我个人而言,我可能会将其拆分为一个单独的方法......我认为它不是特别适合使用 lambda 表达式 - 它是相当大的代码块,它不引用包含方法中声明的任何变量,所以没有真正的好处。)

于 2011-04-11T14:18:04.623 回答
1

看起来您正在重复将内联实现添加到多播委托。

显然这不是你的意图。您将需要按照 Jon Skeet 的建议订阅委托的一个实例,或者每次都管理订阅。

于 2011-04-11T14:26:55.853 回答