我有两个表单,名为'mainForm‘和'addRslt’。当用户单击mainForm中的一个按钮时,addRslt表单将显示(),然后用户将填充一个TreeView。现在,当用户想关闭这个addRslt表单时,程序将相反地隐藏()表单(使用e.Cancel = true; ),因此如果用户重新打开该表单,他/她可以向TreeView添加更多内容。
在我的mainForm中,我有一个按钮来显示这个addRslt表单,而且在这个按钮的单击代码中,还有我的FormClosing委托程序,它将检测addRslt表单中的TreeView内容并将其复制到mainForm中的TreeView中。
现在的问题是,我希望检查重复的节点,而不将它们添加到TreeView中的mainForm中。这样做是正确的,但我也有一个消息框,它告诉用户程序没有添加现有节点!到现在为止还可以。但是问题是每次我这么做的时候,这个消息盒就会出现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;
};
}发布于 2011-04-11 14:18:04
每次显示时都要添加一个FormClosing处理程序。在设置表单的其余部分时,只需添加一次。(就我个人而言,我可能会把它分成一个单独的方法.我不认为它特别适合使用lambda表达式--它是一个相当大的代码块,它不引用包含方法中声明的任何变量,因此没有真正的好处。)
发布于 2011-04-11 14:26:55
看起来您正在重复地将内联实现添加到多播委托中。
很明显这不是你的意图。按照Jon的建议,您要么需要订阅委托的一个实例,要么每次都需要管理委托。
https://stackoverflow.com/questions/5622528
复制相似问题