带有 TextBox 的 CheckedListBox 过滤器
CheckedListBox filter with a TextBox
我是新手,所以这可能是一件简单的事情,但几天后我就坚持了下来。我正在尝试 实现 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);
}
}
}
调试后:Select所有功能运行良好。但是当我过滤并尝试 select 过滤的项目时, if
部分被实现并且控制流向 SelectDeselectAll(true)
.
此外,不起作用的是:
当我 select 全部取消选中列表中的一项时,它不起作用。
我不知道我哪里错了。谁能给我指出正确的方向?
也许可以尝试一些更简单的方法:
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 次提到这个事件。
我是新手,所以这可能是一件简单的事情,但几天后我就坚持了下来。我正在尝试 实现 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);
}
}
}
调试后:Select所有功能运行良好。但是当我过滤并尝试 select 过滤的项目时, if
部分被实现并且控制流向 SelectDeselectAll(true)
.
此外,不起作用的是: 当我 select 全部取消选中列表中的一项时,它不起作用。
我不知道我哪里错了。谁能给我指出正确的方向?
也许可以尝试一些更简单的方法:
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 次提到这个事件。