我有兩種形式,名爲'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