我有两个名为'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;
};
}
答案 0 :(得分:1)
每次显示时都会添加FormClosing
处理程序。只需添加一次,当您设置表单的其余部分时。 (我个人可能会把它分成一个单独的方法......我不认为这是一个特别合适的lambda表达式使用 - 它是一个相当大的代码块,它不引用在contains方法中声明的任何变量,所以没有真正的好处。)
答案 1 :(得分:1)
看起来您正在重复向多播委托添加内联实现。
显然,这不是你的意图。您将需要按照Jon Skeet建议订阅一个代理实例,或者每次都管理子订阅。