使用backgroundWorker在listBox中搜索

时间:2017-05-06 08:38:32

标签: c# winforms search listbox backgroundworker

这是一个C# - WinForm问题: 我试图在listBox中搜索。只有一个listBox充满了一些项目。在程序加载时,listBox中的所有项都被复制到名为' tempList'的类型字符串列表中。 还有一个TextBox。当用户开始键入TextBox时,使用Clear()方法清除listBox。之后,将使用foreach块在tempList中搜索文本框中的单词。每个匹配都将添加到listBox并显示给用户。 我想出了这段代码:

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

问题是,当用户开始输入带有FIRST字符的文本框时,用户界面会中断,用户必须等到搜索完这一个字符然后再进行可以再次键入,这发生在每个角色。为了解决这个问题,我发现我可以使用backgroundWorker。但我不明白如何在这种情况下使用它。任何有用的东西将不胜感激。

2 个答案:

答案 0 :(得分:1)

使用BackgroundWorker类...

...声明

    BackgroundWorker listSearch = new BackgroundWorker();

...初始化

        listSearch.DoWork += ListSearch_DoWork;
        listSearch.RunWorkerCompleted += ListSearch_RunWorkerCompleted;

事件处理程序实现......

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        listSearch.RunWorkerAsync(textBox1.Text);
    }

    private void ListSearch_DoWork(object sender, DoWorkEventArgs e)
    {
        string text = e.Argument as string;
        List<string> items = new List<string>();
        foreach (string item in tempList)
        {
            if (item.ToLower().Contains(text.ToLower()))
            {
                items.Add(item);
            }
        }
        e.Result = items.ToArray();
    }

   private void ListSearch_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        string[] items = e.Result as string[];
        Invoke((Action)(() =>
        {
            listBox1.Items.Clear();
            foreach(string item in items)
            {
                listBox1.Items.Add(item);
            }
        }));
    }

答案 1 :(得分:1)

使用Task类比BackgroundWorker更容易。

尝试这个简单的解决方案:

private async void TextBox_TextChanged(object sender, EventArgs e)
{
    listBox.DataSource = null;

    var task = Task.Run(() =>
        {
            var resultList = new List<string>();

            foreach (string item in tempList)
                if (item.ToLower().Contains(textBox.Text.ToLower()))
                    resultList.Add(item);

            return resultList;
        });

    listBox.DataSource = await task;
}

使用数据绑定来简化代码。在程序加载时,设置

listBox.DataSource = tempList;