2012-05-22 28 views
2

我用下面的代碼在CheckedListBox檢查項目的數量限制爲1:ItemChecked事件處理

 private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e) 
    { 
     if (checkedListBox1.CheckedItems.Count == 1) 
     { 
      Boolean isCheckedItemBeingUnchecked = (e.CurrentValue == CheckState.Checked); 
      if (isCheckedItemBeingUnchecked) 
      { 
       e.NewValue = CheckState.Checked; 
      } 
      else 
      { 
       Int32 checkedItemIndex = checkedListBox1.CheckedIndices[0]; 
       checkedListBox1.ItemCheck -= checkedListBox1_ItemCheck; 
       checkedListBox1.SetItemChecked(checkedItemIndex, false); 
       checkedListBox1.ItemCheck += checkedListBox1_ItemCheck; 
      } 
      return; 
     } 
    } 

但在若干情況下,我需要清除所有選中的項目。我使用下面的代碼來試圖做到這一點,但以前的事件阻止了它的工作。我怎麼能做到這一點?謝謝。

public void ClearChecked() 
    { 
     foreach (int checkedItemIndex in checkedListBox1.CheckedIndices) 
     { 
      checkedListBox1.SetItemChecked(checkedItemIndex, false); 
     } 
    } 
+2

退訂事件首先,然後調用清除選中。或者創建一個指示何時忽略項目更改事件的實例變量。 – mservidio

+0

我想知道爲什麼你不是簡單地使用一個ListBox,其中只能選擇1個值... – Davio

回答

2

您可以創建一個新的變量,表示當ItemCheck事件應該被忽略:

private shouldIgnoreCheckEvent; 

public void ClearChecked() 
{ 
    this.shouldIgnoreCheckEvent = true; 

    foreach (int checkedItemIndex in checkedListBox1.CheckedIndices) 
    { 
     checkedListBox1.SetItemChecked(checkedItemIndex, false); 
    } 

    this.shouldIgnoreCheckEvent = false; 
} 

和更新ItemCheck方法來檢查它是否應該被忽略或不:

private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e) 
{ 
    if (!this.shouldIgnoreCheckEvent && checkedListBox1.CheckedItems.Count == 1) 
    { 
     Boolean isCheckedItemBeingUnchecked = (e.CurrentValue == CheckState.Checked); 
     if (isCheckedItemBeingUnchecked) 
     { 
      e.NewValue = CheckState.Checked; 
     } 
     else 
     { 
      Int32 checkedItemIndex = checkedListBox1.CheckedIndices[0]; 
      checkedListBox1.ItemCheck -= checkedListBox1_ItemCheck; 
      checkedListBox1.SetItemChecked(checkedItemIndex, false); 
      checkedListBox1.ItemCheck += checkedListBox1_ItemCheck; 
     } 
     return; 
    } 
} 
2

這應該清除所有檢查項目:

public void UncheckCheckBoxItems(CheckBoxList cbl) 
{ 
    foreach (ListItem item in cbl.Items) 
    { 
     item.Selected = false; 
    } 
} 
+0

CheckBoxList!= CheckedListBox和WinForms!= WPF。 – Steve

1

最簡單的方法是斷開ItemChecked事件處理程序,執行取消選中然後重新連接事件處理程序。通過這種方式,當您調用SetItemChecked時,將不會觸發任何附加代碼來控制事件處理程序。 只是注意到你已經在你的ItemCheck事件中使用了這個模式。

public void ClearChecked()  
{   
    try 
    { 
     checkedListBox1.ItemCheck -= checkedListBox1_ItemCheck; 
     foreach (int checkedItemIndex in checkedListBox1.CheckedIndices)   
     {    
      checkedListBox1.SetItemChecked(checkedItemIndex, false);   
     } 
    } 
    finally 
    { 
     checkedListBox1.ItemCheck += checkedListBox1_ItemCheck; 

    }  
} 

try/finally很重要,因爲在例外情況下,您的事件處理程序將重新連接。