c#listbox实时搜索

时间:2016-04-14 01:24:20

标签: c# winforms visual-studio

我正在学习c#,我开始制作一些虚拟应用程序,其中包含我可以练习的所有元素。我有搜索文本字段,下面有一个包含项目的列表框。

我尝试使用此代码,但只有在我从第一个字母开始搜索时才得到结果。我希望能够通过单词之间的字母进行搜索。

示例:列表项:" 0445110085" 如果我开始从" 0445"我会得到结果,但我开始用" 5110"例如,我找不到消息项。

以下是我的代码,

private void searchBox_TextChanged(object sender, EventArgs e)
    {
        string myString = searchBox.Text;
        int index = listBox1.FindString(myString, -1);
        if (index != -1)
        {
            listBox1.SetSelected(index,true);
        }
        else 
            MessageBox.Show("Item not found!");
    }

提前致谢。

问候:)

3 个答案:

答案 0 :(得分:3)

使用 StartsWith 方法检查特定项目是否以您输入的字符串开头:

private void searchBox_TextChanged(object sender, EventArgs e)
{
    string prefix = searchBox.Text;
    bool found = false;
    for(int i = 0; i < listBox.Items.Count; i++)
    {
        if(listBox.Items[i].ToString().StartsWith(prefix))
        {
            listBox.SelectedItem = listBox.Items[i];
            found = true;
            break;
        }
    }
    if(!found)
    {
        MessageBox.Show("Item not found!");
    }
}

答案 1 :(得分:3)

来自FindString的详细信息,

在System.Windows.Forms.ListBox中查找开头的第一项 指定的字符串。

因此,您必须自定义编写代码才能实现它。如下所示,

private void textBox1_TextChanged(object sender, EventArgs e)
    {
        string myString = textBox1.Text;
        bool found = false;
        for (int i = 0; i <= listBox1.Items.Count - 1; i++)
        {
            if(listBox1.Items[i].ToString().Contains(myString))
            {
                listBox1.SetSelected(i, true);
                found = true;
                break;
            }
        }                        
        if(!found)
        {
            MessageBox.Show("Item not found!");
        }                
    }

答案 2 :(得分:0)

当然不是最好的解决方案,但它有效

    List<string> search = new List<string>();
    List<string> listBoxItems = new List<string>();
    listBoxItems = listBox1.Items.Cast<string>().ToList();

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        if(!string.IsNullOrEmpty(textBox1.Text))
        {
            search.Clear();
            listBoxItems.ForEach(x =>
            {
                if (IsSubstring(textBox1.Text, x))
                {
                    search.Add(x);
                }
            });
            listBox1.DataSource = null;
            listBox1.DataSource = search;
        } 
        else
        {
            listBox1.DataSource = listBoxItems;
        }
    }

    public bool IsSubstring(string text, string x)
    {
        if (x.ToLower().Contains(text.ToLower()))
        {
            return true;
        } 
        else
        {
            return false;
        }
    }