c# -当选中特定项时,自动检查checklistbox中的项

本文关键字:检查 checklistbox | 更新日期: 2023-09-27 18:12:06

我在我的程序中有一个checklistbox,允许用户控制在图形上启用9个可能的系列中的哪一个。我使用以下代码使其在任何时候只能在图形上启用两个系列:

//if there are two checked items
if (e.NewValue == CheckState.Checked && chListBoxChartSeries.CheckedItems.Count >= 2)
{
    //new item cannot be checked
    e.NewValue = CheckState.Unchecked;
}

这很好。然而,我自己和我的最终用户发现,一个特定的系列(复选列表框和图表系列索引2)实际上没有任何意义,除非将其与其他两个系列(索引3和4)进行比较。我试着修改上面的代码,以识别索引2处的项已被检查,并允许我(甚至是自动地)检查相关索引处的项。完整功能如下图所示:

    private void chListBoxChartSeries_ItemCheck(object sender, ItemCheckEventArgs e)
    {
        int indexA = 2;
        //specify indexes for related parameters
        int indexB = 3;
        int indexC = 4;
        //give positive checkstate
        CheckState autochecked = CheckState.Checked;
        if (chListBoxChartSeries.CheckedItems.Contains(chListBoxChartSeries.Items[indexA]))
        {
            //do not limit number of checked items
            //apply checkstates to items at this index
            chListBoxChartSeries.SetItemCheckState(indexB, autochecked);
            chListBoxChartSeries.SetItemCheckState(indexC, autochecked);
        }
        else //does not contain item at index 2
        {
            //if there are two checked items
            if (e.NewValue == CheckState.Checked && chListBoxChartSeries.CheckedItems.Count >= 2)
            {
                //new item cannot be checked
                e.NewValue = CheckState.Unchecked;
            }
        }
    }

这给我带来了各种各样的错误,尽管没有一个是特别有用的,我在这个论坛上找到的答案似乎与我的问题无关!我真的不知道我离实现我想要实现的目标还有多远,所以任何建议或指出正确方向的话语都将是巨大的帮助!

谢谢,div标记

问题是您在这里创建了一个无限循环。当您选择项目2时,它不会立即添加到chListBoxChartSeries.CheckedItems,直到该方法完成后的一段时间。因此,它不会在第一次迭代时运行if语句的第一部分,因此不会自动检查项目3和4。

之后,当您手动选择项目3时,它运行第一部分。然而,一旦它到达chListBoxChartSeries.SetItemCheckState(indexB, autochecked);,它就会再次触发事件。它将移动到同一行,并无限重复此过程。

这是一个粗略的版本,应该更接近你需要的。这有点匆忙,所以我确定您需要整理一下逻辑:

private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
    int indexA = 2;
    //specify indexes for related parameters
    int indexB = 3;
    int indexC = 4;
    //give positive checkstate
    CheckState autochecked = CheckState.Checked;
    if (e.Index == indexA && !chListBoxChartSeries.CheckedItems.Contains(chListBoxChartSeries.Items[indexA]))
    {
        //do not limit number of checked items
        //apply checkstates to items at this index
        chListBoxChartSeries.SetItemCheckState(indexB, autochecked);
        chListBoxChartSeries.SetItemCheckState(indexC, autochecked);
    }
    else //does not contain item at index 2
    {
        //if there are two checked items
        if (chListBoxChartSeries.CheckedItems.Contains(chListBoxChartSeries.Items[indexA]) && !(e.Index == indexB || e.Index == indexC))
        {
            if (e.NewValue == CheckState.Checked && chListBoxChartSeries.CheckedItems.Count >= 2)
            {
                //new item cannot be checked
                e.NewValue = CheckState.Unchecked;
            }
        }
    }
}

c# -当选中特定项时,自动检查checklistbox中的项