2010-10-06 33 views
3

我遇到與winforms競爭條件的問題。Winform ListViewItem檢查狀態切換

listViewCollections.ItemChecked += foo //Somewhere 

    void foo(object sender, ItemCheckedEventArgs e) 
    { 
     if (e.Item.Checked == false) return; 
     bool flag = bar(e.Item.Index); 
     if (flag) { 
      MessageBox.Show(...) 
      e.Item.Checked = false; 
     } 
    } 

有時消息框會顯示兩次。什麼是正確的方法來做到這一點?提前致謝!

+0

你是否以編程方式將項目設置爲檢查?我可以重現您的問題的唯一方法是將多個項目設置爲以編程方式進行檢查。 – kevev22 2010-10-08 20:17:49

+0

是的,實際上就在第一個if子句後面有一個循環清除(設置爲false)同一個ListView中的其他複選框。我不認爲這是相關的。我希望有些事件會被解僱,如果有條件的話,會被第一個事件抓住。 – Gleno 2010-10-08 22:14:05

+0

也許這將有助於:http://msdn.microsoft.com/en-us/library/c5kehkcz(v=VS.100).aspx – kyndigs 2010-10-11 13:42:02

回答

1

難道你不能只是簡單的鎖定它嗎?此外,我建議切換經過邏輯的工作,以簡化功能的小(去掉中間的函數返回)

private static object fooLock = new object(); 
void foo(object sender, ItemCheckedEventArgs e) 
{ 
    lock (fooLock) 
    { 
     if (e.Item.Checked) 
     { 
      if (bar(e.Item.Index)) 
      { 
       MessageBox.Show(...) 
       e.Item.Checked = false; 
      } 
     } 
    } 
} 

許多方法來提高性能的方式,但至少應該停止比賽條件?