使用backgroundWorker在列表框中搜索

问题描述:

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

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); 
      } 
     } 
    } 

问题是,当用户开始输入到文本框中,第一个字符,用户界面休息和用户必须等待,直到搜索为一个角色完成,然后他们可以再次输入,并且每个角色都会发生这种情况。为了解决这个问题,我想出了我可以使用backgroundWorker。但我不明白如何在这种情况下使用它。任何有用的将不胜感激。

+0

您似乎在尝试使用不同的接口复制自动完成功能。为什么不使用已经内置的UI功能? – Steve

+0

我想自动完成是一个建议用户在输入文字并追加到文本框内容的单词?不,这不是我的意图。我特别试图在列表框中搜索在文本框中键入的单词。 – arm

+0

只有在用户离开文本框或按下'enter'后,才应该开始搜索。 – Fabio

使用的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); 
      } 
     })); 
    } 
+0

令人惊叹!这完全像我想要的那样。不够感谢你。 – arm

+0

注意:运行工人完成处理程序中的调用是多余的。我只是做了一个快速检查,运行工作人员总是运行在创建后台工作者的同一线程上。所以你可以简化一下。 – AQuirky

使用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;