【问题标题】:One checkBox to check/uncheck ALL other checkBoxes in CheckedListBox (C# winForms)一个复选框用于选中/取消选中 CheckedListBox 中的所有其他复选框(C# winForms)
【发布时间】:2023-03-19 22:36:01
【问题描述】:

我有一个带有 5 个 CheckBox 的 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”......递归......导致无限循环,其中选定的始终是“全部”,仍然是“未选中”,并且 i 再次从 1 开始。 我该如何解决这个问题?

【问题讨论】:

    标签: c# winforms checkedlistbox


    【解决方案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);
        }
    }
    

    【讨论】:

    • 你这个人 :) 工作! “更好的方法是保留所有项目的引用”这将是理想的,但给定的 checkListBox 不允许单独引用 CheckBox,所以我不得不解决这个问题。
    【解决方案2】:

    我试图查看您的代码和我想到的 2 件事:

    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);
    }
    

    因为如果您打算在循环中添加第二行,您可能会忘记添加大括号 - 程序可能仍在编译并且很难找到问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-25
      • 1970-01-01
      • 2020-08-12
      • 1970-01-01
      • 2023-04-05
      • 2015-11-17
      • 2021-12-01
      相关资源
      最近更新 更多