即使未选中框,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()));
  }));
}