这是一个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。但我不明白如何在这种情况下使用它。任何有用的东西将不胜感激。
答案 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;