C# - 选中特定项目时自动选中选中列表框中的项目
C# - Auto-check items in checkedlistbox when specific item is checked
我的程序中有一个选中的列表框,允许用户控制在图表上启用 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;
}
这很好用。然而,我自己和我的最终用户发现一个特定的系列(checkedlistbox 和图表系列索引 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;
}
}
}
这给我带来了各种各样的错误,尽管其中 none 提供了特别有用的信息,而且我在这个论坛上找到的答案似乎与我的问题无关!
我真的不知道我离实现我想要实现的目标还有多远,所以任何正确方向的建议或观点都会有很大的帮助!
谢谢,
马克
问题是您在这里创建了一个无限循环。当您 select 项目 2 时,它不会立即添加到 chListBoxChartSeries.CheckedItems
直到此方法完成一段时间后。因此,它不会 运行 第一次迭代中 if
语句的第一部分,因此不会自动检查第 3 项和第 4 项。
稍后,当您手动 select 时,例如第 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;
}
}
}
}
我的程序中有一个选中的列表框,允许用户控制在图表上启用 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;
}
这很好用。然而,我自己和我的最终用户发现一个特定的系列(checkedlistbox 和图表系列索引 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;
}
}
}
这给我带来了各种各样的错误,尽管其中 none 提供了特别有用的信息,而且我在这个论坛上找到的答案似乎与我的问题无关! 我真的不知道我离实现我想要实现的目标还有多远,所以任何正确方向的建议或观点都会有很大的帮助!
谢谢, 马克
问题是您在这里创建了一个无限循环。当您 select 项目 2 时,它不会立即添加到 chListBoxChartSeries.CheckedItems
直到此方法完成一段时间后。因此,它不会 运行 第一次迭代中 if
语句的第一部分,因此不会自动检查第 3 项和第 4 项。
稍后,当您手动 select 时,例如第 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;
}
}
}
}