[英]One checkBox to check/uncheck ALL other checkBoxes in CheckedListBox (C# winForms)
我有一個帶有5個CheckBoxes的CheckedListBox,我希望第一個為“ All”。 我記下了這段代碼,但是卻遇到了無盡的循環:
private void chkLstBx_ItemCheck(object sender, ItemCheckEventArgs e)
{
// ----- Get the name of the CheckBox that's changed: -----
string selected = chkLstBx.SelectedItem + "";
// ----- If "All" changed: -----
if (selected.Equals("All"))
// ----- to TRUE(from unchecked): -----
if (("" + (chkLstBx.GetItemCheckState(0))).Equals("Unchecked"))
for (int i = 1; i < chkLstBx.Items.Count; i++)
**chkLstBx.SetItemChecked(i, true);**
else // ----- to FALSE(from checked): -----
for (int i = 1; i < chkLstBx.Items.Count; i++)
chkLstBx.SetItemChecked(i, false);
// -----------------------------------------------
// -------------- REST OF CODE HERE --------------
// -----------------------------------------------
}
不幸的是,粗體行(**)再次調用“ chkLstBx_ItemCheck” ...遞歸...導致無休止的循環,其中所選內容始終為“ All”,仍然為“ Unchecked”,並且我再次從1開始。 我該如何解決?
在此代碼中,請注意,這會將列表中的第一個項目用作“ All
項目。 這是一個好習慣,但更好的做法是保留所有項目的引用,並使用它來檢查事件處理程序中檢查了哪個項目。
private void chkLstBx_ItemCheck(object sender, ItemCheckEventArgs e)
{
if (e.Index == 0)
{
if (e.NewValue == CheckState.Checked)
ChangeAllCheckBoxValues(true);
else
ChangeAllCheckBoxValues(false);
}
}
private void ChangeAllCheckBoxValues(bool value)
{
for (int i = 1; i < chkLstBx.Items.Count; i++)
{
chkLstBx.SetItemChecked(i, value);
}
}
我試圖查看您的代碼和我想到的兩件事:
1)原因是ItemCheck的綁定是針對chkListBx的,而不是針對特定行的,因此,當您更改特定行的項目檢查時,它將再次調用此方法-查找選定的值並再次調用該方法。 我可以通過將綁定更改為“ SelectedIndexChanged”來使其工作-盡管您可能需要檢查它是否與其余代碼一起工作。
2)當將綁定更改為“ SelectedIndexChanged”時,我得到的行為與之相反(即:All仍未選中,而所有其他復選框均已選中)。 原因是當它以前未被選中時(當我單擊它時,它會將值設置為“已檢查”),因此,在對其進行評估時,該值被視為“檢查”了,然后全部變為“取消選擇” 。
注意:順便說一句,即使單行也要始終保持括號是更好的選擇
for (int i = 1; i < chkLstBx.Items.Count; i++)
chkLstBx.SetItemChecked(i, false);
成
for (int i = 1; i < chkLstBx.Items.Count; i++)
{
chkLstBx.SetItemChecked(i, false);
}
因為如果您要添加第二行打算放在循環中,則可能會忘記添加花括號-程序可能仍在此處編譯,因此很難發現問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.