即使未选中框,checkedListBox 中的 C# 项目也会被选中
C# Item in checkedListBox gets selected even though box is unchecked
如果我选中某个项目然后决定取消选中,则代码会认为它仍处于选中状态。结果是,当我单击 "Go" 时,table 还会列出未选中的项目。在这种情况下,Brandon 首先被选中,然后被取消选中。即使名称不再是 "checked",table 仍然会出现。
这是我的:
string filterstring = "";
private void checkedListBox_ItemCheck(object sender, ItemCheckEventArgs e)
{
if (e.NewValue == CheckState.Checked)
filterstring = "Responsible = '" + checkedListBox.Items[e.Index].ToString() + "' OR";
else
if (e.NewValue == CheckState.Unchecked)
filterstring = "";
foreach (object itemChecked in checkedListBox.CheckedItems)
{
filterstring += " Responsible = '" + itemChecked.ToString() + "' OR";
}
filterstring = filterstring.Substring(0, filterstring.LastIndexOf("OR"));
}
我怀疑关键在这部分代码中。没有它,它会抛出异常:
private void checkedListBox_ItemCheck(object sender, ItemCheckEventArgs e)
{
if (e.NewValue == CheckState.Unchecked)
filterstring = "";
}
感谢任何帮助!
在触发 ItemCheck 事件 之后 才会更新检查项目列表,因此您的 for-each 循环不会报告准确的检查项目。
为避免这种情况,请使用 BeginInvoke 调用:
this.BeginInvoke(new Action(() => {
foreach (var itemChecked in checkedListBox1.CheckedItems) {
filterString += itemChecked.ToString();
}
}));
此代码基本上会在 ItemCheck 事件方法被调用后立即 运行。
更新:
由于您在 SubString 代码上遇到异常,请尝试像这样创建过滤器文本:
List<string> filters = new List<string>();
void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e) {
this.BeginInvoke(new Action(() => {
filters = new List<string>();
foreach (var itemChecked in checkedListBox1.CheckedItems) {
filters.Add("'" + itemChecked.ToString() + "'");
}
MessageBox.Show("Responible = " + string.Join(" OR ", filters.ToArray()));
}));
}
如果我选中某个项目然后决定取消选中,则代码会认为它仍处于选中状态。结果是,当我单击 "Go" 时,table 还会列出未选中的项目。在这种情况下,Brandon 首先被选中,然后被取消选中。即使名称不再是 "checked",table 仍然会出现。
这是我的:
string filterstring = "";
private void checkedListBox_ItemCheck(object sender, ItemCheckEventArgs e)
{
if (e.NewValue == CheckState.Checked)
filterstring = "Responsible = '" + checkedListBox.Items[e.Index].ToString() + "' OR";
else
if (e.NewValue == CheckState.Unchecked)
filterstring = "";
foreach (object itemChecked in checkedListBox.CheckedItems)
{
filterstring += " Responsible = '" + itemChecked.ToString() + "' OR";
}
filterstring = filterstring.Substring(0, filterstring.LastIndexOf("OR"));
}
我怀疑关键在这部分代码中。没有它,它会抛出异常:
private void checkedListBox_ItemCheck(object sender, ItemCheckEventArgs e)
{
if (e.NewValue == CheckState.Unchecked)
filterstring = "";
}
感谢任何帮助!
在触发 ItemCheck 事件 之后 才会更新检查项目列表,因此您的 for-each 循环不会报告准确的检查项目。
为避免这种情况,请使用 BeginInvoke 调用:
this.BeginInvoke(new Action(() => {
foreach (var itemChecked in checkedListBox1.CheckedItems) {
filterString += itemChecked.ToString();
}
}));
此代码基本上会在 ItemCheck 事件方法被调用后立即 运行。
更新:
由于您在 SubString 代码上遇到异常,请尝试像这样创建过滤器文本:
List<string> filters = new List<string>();
void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e) {
this.BeginInvoke(new Action(() => {
filters = new List<string>();
foreach (var itemChecked in checkedListBox1.CheckedItems) {
filters.Add("'" + itemChecked.ToString() + "'");
}
MessageBox.Show("Responible = " + string.Join(" OR ", filters.ToArray()));
}));
}