作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
因此,我正在使用 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);
}
}
}
最佳答案
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
对待
true
如
CheckState.Checked
和
false
如
CheckState.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
在运行时,然后添加
liscollection
至
checkedListBox1.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,所以当你尝试转换为
CheckedListBoxItem
在
ItemCheck
事件失败。这就是为什么你会得到
NullReferenceException
.
关于c# - 在搜索c#winforms上保持复选框列表中项目的检查状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60643760/
我是一名优秀的程序员,十分优秀!