显示/隐藏列表框中的项目

本文关键字:项目 列表 隐藏 显示 | 更新日期: 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;
}