如果我有一个我检查的项目,然后我决定取消选中,那么代码有点认为它仍然被检查。结果是,当我单击“开始”时,该表还列出了未选中的项目。在这种情况下,首先检查Brandon,然后取消选中。即使名称不再“检查”,表格仍然会显示出来。
这就是我所拥有的:
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 = "";
}
感谢任何帮助!
答案 0 :(得分:0)
在触发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()));
}));
}