2011-04-11 142 views
1

我有两种形式,名为'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; 
     }; 
    } 

回答

1

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

+0

谢谢乔恩。你的意思是问题在于'+ ='我用了吗?我只用'='尝试过,但不能编译。怎么做?你想介绍一下更好的做法吗? – 2011-04-11 14:21:06

+0

@ Sean87:是的,'+ ='增加了一个额外的事件处理程序。你不能使用'=',因为它是发布者/订阅者模型 - 你不能*替换订阅,只能添加/删除它们。只要将此事件处理程序订阅移动到您初始化addRslt的任何位置(或者在InitializeComponent位于该位置之后),以便只添加一个处理程序,但通常会显示该表单。另一方面,将代码移动到一个单独的方法中,并以与订阅Click处理程序相同的方式进行订阅。 – 2011-04-11 14:24:03

1

它看起来像你正在重复添加你的内联实现到多播委托。

显然这不是你的意图。您可能需要按照Jon Skeet的建议订阅代理的一个实例,或者每次都要管理这些代理。