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