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
处理程序。当您设置表单的其余部分时,只需添加一次即可。(就我个人而言,我可能会把它分成一个单独的方法……我不认为这是一个特别合适的使用lambda表达式-它是一个相当大的代码块,不引用任何变量声明在包含方法中,所以没有真正的好处。
看起来您正在重复地将内联实现添加到多播委托中。
显然这不是你的本意。您要么需要像Jon Skeet建议的那样订阅一个委托实例,要么每次都管理订阅。