2011-04-11 93 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的建議訂閱代理的一個實例,或者每次都要管理這些代理。