gpt4 book ai didi

c# - 在搜索c#winforms上保持复选框列表中项目的检查状态

转载 作者:行者123 更新时间:2023-12-03 18:21:18 25 4
gpt4 key购买 nike

因此,我正在使用 c# 为 winforms 中的选中列表框中的一堆项目开发基于文本框的过滤器。

到目前为止,我有这个代码:

List<string> liscollection = new List<string>();
private void textBox1_TextChanged(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(textBox1.Text) == false)
{
checkedListBox1.Items.Clear();

foreach (string str in liscollection)
{
if (str.Contains(textBox1.Text, StringComparison.OrdinalIgnoreCase))
{
checkedListBox1.Items.Add(str);
}
}
}
else if (textBox1.Text == "")
{
checkedListBox1.Items.Clear();
foreach (string str in liscollection)
{
checkedListBox1.Items.Add(str);
}
}
}

它工作正常,当我在 TextBox1 中输入文本时,所有不包含输入文本的项目都会消失。
问题出现在每个项目的选中状态。每次checkListBox1.Items.Clear();被调用,检查状态也被清除。

有没有一种方法可以让过滤器保持工作但不清除项目的选中状态?

我一直在寻找一段时间,但找不到任何关于此的内容,而且我是初学者,无法自己提出解决方案。

非常感谢您抽出宝贵时间!

请原谅我的英语,这不是我的第一语言 :)

最佳答案

CheckListBox.Items ObjectCollection 类型,这意味着它将接受任何 object而不仅仅是string .默认情况下,CheckedListBox将显示 ToString 的结果作为项目的文本。

这意味着你可以写一个 class表示存储在 CheckedListBox 中的项目跟踪自己的CheckedState属性,然后覆盖 ToString方法,以便它显示您想要的文本。

// CheckedListBoxItem.cs
public class CheckedListBoxItem
{
/// <summary>
/// The item's text - what will be displayed in the CheckedListBox.
/// </summary>
public string Text { get; set; }

/// <summary>
/// The item's check state.
/// </summary>
public CheckState CheckState { get; set; } = CheckState.Unchecked;

/// <summary>
/// Whether the item is checked or not.
/// </summary>
public bool Checked
{
get
{
return (CheckState == CheckState.Checked || CheckState == CheckState.Indeterminate);
}
set
{
if (value)
{
CheckState = CheckState.Checked;
}
else
{
CheckState = CheckState.Unchecked;
}
}
}

public bool Contains(string str, StringComparison comparison)
{
return Text.IndexOf(str, comparison) >= 0;
}

public override string ToString()
{
return Text;
}
}
CheckedListBoxItem.Checked 的行为基于 CheckedListBox.GetItemChecked 对待 CheckState.Interetminate经检查,和 CheckedListBox.SetItemChecked 对待 trueCheckState.CheckedfalseCheckState.Unchecked .

在您的 Form ,然后您将更改 lstcollection 的类型至 List<CheckedListBoxItem>并设置 Text每个项目的属性到您现在拥有的字符串。
CheckedListBox没有任何方法可以绑定(bind) CheckState每个项目,所以你必须自己管理。幸好有 CheckedListBox.ItemChecked 每当项目的选中状态更改时将触发的事件。因此,您可以使用以下函数处理事件...
private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
// Since each item in the CheckedListBox is of type CheckedListBoxItem, we can
// just cast to that type...
CheckedListBoxItem item = checkedListBox1.Items[e.Index] as CheckedListBoxItem;

// Then set the checked state to the new value.
item.CheckState = e.NewValue;
}

您的过滤器功能基本保持不变,但是当您将项目添加到 CheckedListBox你必须通过 CheckedState还有……
private List<CheckedListBoxItem> liscollection;

private void textBox1_TextChanged(object sender, EventArgs e)
{
checkedListBox1.Items.Clear();
if (string.IsNullOrEmpty(textBox1.Text) == false)
{
foreach (var item in liscollection)
{
if (item.Contains(textBox1.Text, StringComparison.OrdinalIgnoreCase))
{
checkedListBox1.Items.Add(item, item.CheckState);
}
}
}
else
{
foreach (var item in liscollection)
{
checkedListBox1.Items.Add(item, item.CheckState);
}
}
}

编辑

对于这种情况,我不会将这些项目添加到 checkedListBox1在设计时。我会将它们添加到 liscollection在运行时,然后添加 liscollectioncheckedListBox1.Items .
public class YourForm : Form
{
public YourForm()
{
InitializeComponent();

// You would add one item to liscollection for each item that you have in the checkedListBox1's designer and set the Text to whatever the item is now...
liscollection = new List<CheckedListBoxItem>
{
new CheckedListBoxItem { Text = "The" },
new CheckedListBoxItem { Text = "needs" },
new CheckedListBoxItem { Text = "of" },
new CheckedListBoxItem { Text = "the" },
new CheckedListBoxItem { Text = "many" },
new CheckedListBoxItem { Text = "outweigh" },
new CheckedListBoxItem { Text = "the" },
new CheckedListBoxItem { Text = "needs" },
new CheckedListBoxItem { Text = "of" },
new CheckedListBoxItem { Text = "the" },
new CheckedListBoxItem { Text = "few" },
};
checkedListBox1.Items.AddRange(liscollection.ToArray());
}
}

如果您真的更喜欢填充 checkedListBox1从设计师那里,你也可以这样做。您只需调用 checkedListBox1.Items.Clear()填充后 liscollection在调用 checkedListBox1.Items.AddRange(...) 之前
public class YourForm : Form
{
public YourForm()
{
InitializeComponent();

liscollection = new List<CheckedListBoxItem>();
foreach(string str in checkedListBox1.Items)
{
liscollection.Add(new CheckedListBoxItem { Text = str });
}
checkedListBox1.Items.Clear();
checkedListBox1.Items.AddRange(liscollection.ToArray());
}
}

重要的一行是 checkedListBox1.Items.AddRange(liscollection.ToArray()) .你想要 Items成为 CheckedListBoxItem 的实例, 这样在 ItemCheck事件您可以将项目转换为 CheckedListBoxItem 的实例.通过填充 checkedListBox1从设计师那里,你用 string 填充它s only,所以当你尝试转换为 CheckedListBoxItemItemCheck事件失败。这就是为什么你会得到 NullReferenceException .

关于c# - 在搜索c#winforms上保持复选框列表中项目的检查状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60643760/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com