FormClosing delegate事件问题

本文关键字:问题 事件 delegate FormClosing | 更新日期: 2023-09-27 17:49:36

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

FormClosing delegate事件问题

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

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

显然这不是你的本意。您要么需要像Jon Skeet建议的那样订阅一个委托实例,要么每次都管理订阅。