【问题标题】:C# Searching a listBoxC# 搜索列表框
【发布时间】:2011-06-20 05:15:46
【问题描述】:

我在一个名为 listBox1 的列表框中有大量项目。我在顶部还有一个文本框(textBox1)。我希望能够在 textBox 中输入内容,listBox 会搜索它的项目并找到包含我正在输入的内容的项目。

例如,说 listBox 包含

“猫”

“狗”

“胡萝卜”

和“花椰菜”

如果我开始输入字母 C,那么我希望它同时显示 Cat 和 Carrot,当我输入 a 时它应该继续显示它们,但是当我添加一个 r 时它应该从列表中删除 Cat。有没有办法做到这一点?

【问题讨论】:

  • 您使用的是什么 GUI 框架?窗体? WPF?还有什么? TextBoxListBox 不是纯 C# 的一部分...
  • WinForms,对不起,我应该这么说。

标签: c# winforms search listbox


【解决方案1】:

【讨论】:

  • -1 虽然类似,但这是一个 ComboBox; OP 有一个 ListBox 和一个 TextBox。假设当您键入行为时,OP 正在执行类似于过滤器的操作,例如 ICollectionView.Filter
【解决方案2】:

我认为您需要使用 linq 查询,然后对结果进行数据绑定。 WPF 中的一个例子是here,但我相信你可以在 winforms 中做同样的事情。

【讨论】:

    【解决方案3】:

    基本示例;但是,这应该可以帮助您入门...

        public partial class Form1 : Form
        {
            List<String> _animals = new List<String> { "cat", "carrot", "dog", "goat", "pig" };
    
            public Form1()
            {
                InitializeComponent();
    
                listBox1.Items.AddRange(_animals.ToArray());
            }
    
            private void textBox1_TextChanged(object sender, EventArgs e)
            {
                String search = textBox1.Text;
    
                if (String.IsNullOrEmpty(search))
                {
                    listBox1.Items.Clear();
                    listBox1.Items.AddRange(_animals.ToArray());
                }
    
                var items = (from a in _animals
                            where a.StartsWith(search)
                            select a).ToArray<String>();
    
                listBox1.Items.Clear();
                listBox1.Items.AddRange(items);
            } 
        }
    

    【讨论】:

    • 如果列表很长,Clear 和 AddRange 会不会对性能不利?还是因为都是引用所以没关系?
    • 在某些时候会出现基于列表大小的性能冲击;但是,您可以在注意到性能损害之前扩大到合适的大小。
    • 你知道合适的尺寸是多少吗?或者在哪里?我预计列表中至少有几百个项目。
    • @LukeBerry 几百个就可以了
    【解决方案4】:

    过滤列表框。试试这个:

        List<string> items = new List<string>();
        private void Form1_Load(object sender, EventArgs e)
        {
            items.AddRange(new string[] {"Cat", "Dog", "Carrots", "Brocolli"});
    
            foreach (string str in items) 
            {
                listBox1.Items.Add(str); 
            }
        }
    
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            listBox1.Items.Clear();
    
            foreach (string str in items) 
            {
                if (str.StartsWith(textBox1.Text, StringComparison.CurrentCultureIgnoreCase))
                {
                    listBox1.Items.Add(str);
                }
            }
        }
    

    【讨论】:

    • 如果你不打算使用 AddRange,你应该使用 BeginUpdate/EndUpdate 来禁止不需要的绘图
    • 非常喜欢这个。谢谢!
    【解决方案5】:

    要获得所要求的结果,您必须使用 Contains 方法而不是 StartWith 方法。 像这样:-

    private void textBox1_TextChanged(object sender, EventArgs e)
        {
            listBox1.Items.Clear();
    
            foreach (string str in items)
            {
                if (str.ToUpper().Contains(textBox1.Text.ToUpper()))
                {
                    listBox1.Items.Add(str);
                }
            }
        }
    

    我正在寻找这个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多