我有两种形式,名为'mainForm'和'addRslt'。这个想法是当用户点击mainForm中的一个按钮时,addRslt表单将显示(),然后用户将填充一个TreeView。现在,当用户想CLOSE这个addRslt形式,程序将代替隐藏()形式(使用e.Cancel = TRUE;),所以以后如果用户重新打开这一点,他/她可以添加更多的东西到TreeView。FormClosing委托事件问题
在我的mainForm中,我有一个用于显示此addRslt窗体的按钮,并且在此按钮的点击代码中,还有我的FormClosing代理,它将检测并复制内容为TreeView的addRslt形式的内容为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;
};
}
谢谢乔恩。你的意思是问题在于'+ ='我用了吗?我只用'='尝试过,但不能编译。怎么做?你想介绍一下更好的做法吗? – 2011-04-11 14:21:06
@ Sean87:是的,'+ ='增加了一个额外的事件处理程序。你不能使用'=',因为它是发布者/订阅者模型 - 你不能*替换订阅,只能添加/删除它们。只要将此事件处理程序订阅移动到您初始化addRslt的任何位置(或者在InitializeComponent位于该位置之后),以便只添加一个处理程序,但通常会显示该表单。另一方面,将代码移动到一个单独的方法中,并以与订阅Click处理程序相同的方式进行订阅。 – 2011-04-11 14:24:03