【问题标题】:CheckedListBox filter with a TextBox带有 TextBox 的 CheckedListBox 过滤器
【发布时间】:2019-05-14 18:01:21
【问题描述】:

我是新手,所以这可能是一件简单的事情,但几天后我就陷入了困境。我正在尝试实现 Select All 功能并在我的表单中使用 TextBox 过滤 CheckedListBox。
类似于 Excel 过滤器的东西。类似于下图:

我正在用一个数组填充 CheckedListBox。数组容量根据项目的数量不断变化。可能是10或20或50以上。

我尝试过的:

private void checkedListBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (checkedListBox1.GetItemChecked(0) == true)
            SelectDeselectAll(true);
        else if (checkedListBox1.GetItemChecked(0) == false)
            SelectDeselectAll(false);
        //when select all is checked, and I uncheck a item in the list, uncheck select all and the item
        else //if (checkedListBox1.GetItemChecked(0) == true && checkedListBox1.GetItemChecked(0) )
            SelectDeselectAll(null);
    }

    private void SearchBox_TextChanged(object sender, EventArgs e)
    {
        string filter_param = SearchBox.Text.ToUpper();
        var item = checkedListBox1.Items.Cast<string>().ToList();
        List<string> filteredItems = item.FindAll(x => x.StartsWith(filter_param));

        checkedListBox1.DataSource = filteredItems;

        // if all values removed, bind the original full list again
        if (String.IsNullOrWhiteSpace(SearchBox.Text))
        {
            checkedListBox1.DataSource = cboxAr;
        }
    }

    private void SelectDeselectAll(bool? v)
    {
        if (v == true)
        {
            for (int i = 1; i < checkedListBox1.Items.Count; i++)
                checkedListBox1.SetItemChecked(i, true);
        }
        else if (v == false)
            checkedListBox1.ClearSelected();
        else if (v == null)
        {
            IEnumerable<int> notChecked = (from int item in checkedListBox1.Items
                                           where !checkedListBox1.CheckedIndices.Contains(item)
                                           select item);

            if (checkedListBox1.GetItemChecked(0) == true)
            {
                SelectDeselectAll(false); 
                foreach (int j in notChecked)
                    checkedListBox1.SetItemChecked(j, true);
            }
        }
    }

调试后:选择所有功能运行良好。但是当我过滤并尝试选择过滤的项目时,if 部分被实现并且控制流向SelectDeselectAll(true)

另外,不起作用的是: 当我选择所有而不是取消选中列表中的一项时,它不起作用。

我不知道我哪里错了。谁能指出我正确的方向?

【问题讨论】:

    标签: c# winforms filter checkedlistbox


    【解决方案1】:

    也许可以尝试一些更简单的方法:

        private void checkedListBox1_SelectedValueChanged(object sender, EventArgs e)
        {
            if (checkedListBox1.SelectedIndex == 0)
            {
                for (int i = 0; i < checkedListBox1.Items.Count; i++)
                {
                    checkedListBox1.SetItemCheckState(i, checkedListBox1.GetItemCheckState(0));
                }
            }
            else //if you unchecked one of the other checkbox when select all is checked, then the select all is unchecked 
            {
                if (checkedListBox1.GetItemCheckState(0) == CheckState.Checked)
                {
                    checkedListBox1.SetItemCheckState(0, CheckState.Unchecked);
                }
            }
        }
    
        private void SearchBox_TextChanged(object sender, EventArgs e)
        {
            List<string> filtered= cboxAr.AsEnumerable()
                .Where(x => x.ToUpper().Contains(SearchBox.Text.ToUpper()))
                .ToList();
    
            checkedListBox1.DataSource = filtered;
            if (String.IsNullOrWhiteSpace(SearchBox.Text))
            {
                checkedListBox1.DataSource = cboxAr;
            }
        }
    

    确保将事件更改为 SelectedValueChanged, 并让 DoubleClick 事件也调用此事件。

    我建议您在为 CheckBoxList 分配初始值时添加这些行:

    checkedListBox1.SelectedValueChanged -= checkedListBox1_SelectedValueChanged;
    checkedListBox1.DataSource = cboxAr;
    checkedListBox1.SelectedValueChanged += checkedListBox1_SelectedValueChanged;
    

    因为当将数据分配给数据源时,值也会发生变化并且事件会发生

    所以您应该总共有 4 次引用此事件。

    【讨论】:

    • 它与操作发布的相同。
    • 对不起,这是一个错误,我上传了一个工作版本@AshishSrivastava
    • @DorLugasi 谢谢你的回答。但是你能告诉我把你推荐的代码放在哪里吗?
    • 另外,当我单击select all 并取消选中checkedlistbox 中的任何一个值时,select all 选项仍处于选中状态。而当我尝试手动取消选中select all 时,一切都未选中。
    • 非常感谢您的帮助,非常抱歉给您带来麻烦。也谢谢你的解释
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-26
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 2020-06-07
    • 2015-05-27
    • 1970-01-01
    相关资源
    最近更新 更多