FormClosing委托事件问题

时间:2011-04-11 14:11:11

标签: c# delegates messagebox formclosing

我有两个名为'mainForm'和'addRslt'的表单。想法是当用户点击mainForm中的按钮时,addRslt表单将显示Show(),然后用户将填充TreeView。现在当用户想要关闭这个addRslt表单时,程序将改为隐藏()表单(使用 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;
        };
    }

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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