即使取消选中框,也会选中checkedListBox中的C#项

时间:2016-10-06 22:15:43

标签: c# checkedlistbox

如果我有一个我检查的项目,然后我决定取消选中,那么代码有点认为它仍然被检查。结果是,当我单击“开始”时,该表还列出了未选中的项目。在这种情况下,首先检查Brandon,然后取消选中。即使名称不再“检查”,表格仍然会显示出来。

Item still checked

这就是我所拥有的:

    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 = "";
    }

感谢任何帮助!

1 个答案:

答案 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()));
  }));
}