显示/隐藏列表框中的项目
本文关键字:项目 列表 隐藏 显示 | 更新日期: 2023-09-27 17:58:10
我做了一个列表框,它运行得很好,我还做了一项搜索功能,但我想隐藏列表框中的项目,只在通过索引搜索时显示它们。这是我添加项目的代码
private void Savebtn_Click(object sender, EventArgs e)
{
addTolist(gatherItem());
refreshView();
}
private void addTolist(Person p)
{
Person.listperson.Add(p);
}
private void refreshView()
{
listBox1.Items.Add(getItem());
}
private String getItem()
{
String result = null;
foreach (Person p in Person.listperson)
{
result = p.lastname;
}
return result;
}
这是我搜索的代码
private void button1_Click(object sender, EventArgs e)
{
int index = listBox1.FindString(textBox6.Text);
if (0 <= index)
{
listBox1.SelectedIndex = index;
}
}
有办法吗?谢谢:)
使用winforms没有简单的方法可以做到这一点。有了WPF就容易多了。使用winforms,您将不得不remove
项目。从技术上讲,您可以使用数据绑定,但根本不建议使用,因为根据MSDN文档,listbox应该直接从代码中使用。
仔细想想,你可以透支列表框,并将你想隐藏的项目设置为透明或其他什么,但这并不容易。您可能需要考虑将所有值存储在一个数组中,然后在数组中循环,只添加所需的元素。或者切换到WPF。
希望这能有所帮助。
您可以在原点一上覆盖一个伪ListBox,并将原点一设置为不可见。然后你可以通过编写之类的代码来归档相同的效果
class DummyItem {
public string text;
public int index;
public override string ToString() {
return text;
}
}
public void build_dummy() {
listbox_dummy.Items.Clear();
for (int i = 0; i < listbox_origin.Items.Count; i++) {
// replace with your own judgement
if (! should_hide(listbox_origin.Items[i])) {
DummyItem item = new DummyItem();
item.text = listbox_origin.Items[i].ToString();
item.index = i;
listbox_dummy.Items.Add(item);
}
}
}
private void listbox_dummy_SelectedIndexChanged(object sender, EventArgs e) {
var item = (DummyItem) listbox_dummy.SelectedItem;
var index = item.index;
listbox_origin.SelectedIndex = index;
}
实现这一点的最简单方法是创建一个List<string>
项目,该项目将存储已删除的项目(或与textbox1
中给定的搜索短语不匹配的项目),int
变量将存储上次触发TextChanged
事件时有多少个字符,然后为您的列表框元素创建一个函数,该函数在文本框中的短语更新时激活:
private void textbox1_TextChanged(object sender, EventArgs e) {}
在这个函数中,有两件事可能发生:
-
如果将字符添加到
textbox1
:- 对
listbox
中的元素进行迭代 - 删除
textbox1
中不包含短语的
- 对
-
如果从
textbox1
:中删除了字符- 查看您为存储从
listbox
中删除的值而创建的List<string>
变量 - 添加回符合
textbox1
中文本的每个项目(不过要检查是否重复)
- 查看您为存储从
这是我写的代码作为参考:
private List<string> temporarilyRemovedSongs = new List<string>();
private int previousTextLength = 0;
private void filter_songs_textbox_TextChanged(object sender, EventArgs e)
{
List<string> toRemove = new List<string>();
string text = Tools.Strip(this.filter_songs_textbox.Text.ToLower());
if (text.Length > this.previousTextLength)
{
// a char was added, remove songs that do not start with the search-phrase
foreach (string song in this.songs_list.Items)
{
if (!song.ToLower().Contains(text))
{
this.temporarilyRemovedSongs.Add(song);
toRemove.Add(song);
}
}
foreach (string song in toRemove)
{
this.songs_list.Items.Remove(song);
}
}
else
{
// a char was removed; look through removed songs to add back
foreach (string song in this.temporarilyRemovedSongs)
{
if (song.Contains(text) && !this.songs_list.Items.Contains(song))
this.songs_list.Items.Add(song);
}
}
previousTextLength = text.Length;
}