簡體   English   中英

一個復選框,用於選中/取消選中CheckedListBox中的所有其他復選框(C#winForms)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM