在我的应用程序中,在用户将两个以上的字符放入textBox后填充ListBox。
如果要填充ListBox有很多,那么用户必须等到ListBox完全填满才能继续输入。
现在我需要一个解决方案来填充ListBox而不会阻止UI,所以我想使用后台工作程序来解决这个问题。
----原始版本-----
在我的应用程序中,当用户将两个以上的字符放入textBox时,我会填充一个ListBox。 ListBox填充结果,在此之后,用户可以输入更多字符。
我的问题是以下行为:用户只能在之后放入下一个char ,整个ListBox都填充了所有条目。如果有很多结果,用户必须等到他能够继续。
我希望有以下行为:如果用户放入一个char,ListBox的填充应该停止并为新输入构建列表。
我想到了......像:[PSEUDO-CODE]
loop over results {
if (UserInput) { // <-- GetKeyState()?
break
}
AddOneItemToListBox
}
[/PSEUDO-CODE]
我想到了......像GetKeyState(),但我认为应该有一个更优雅的方式(可能是一个控件或其他我不了解的ATM技术)。
PS:目前我正在寻找.Net2.0的解决方案,但如果在.Net的更新版本中有技术,我也会很高兴提供一个简短的提示(仅供我参考)。
答案 0 :(得分:4)
您可以在BackgroundWorker
内填写ListBox(不要忘记使用Add()
调用BeginInvoke()
方法)。在这种情况下,用户可以在填充框时与GUI进行交互。
如果用户在自己的框中添加了某些内容,则可以通过调用worker.CancelAsnyc()
来停止自动填充。
不幸的是我没有VS2005尝试它,但我删除了所有花哨的lambda等东西。
只是一个简单的开始样本:
public partial class FormMain : Form
{
BackgroundWorker _Worker;
public FormMain()
{
InitializeComponent();
_Worker = new BackgroundWorker();
_Worker.DoWork += OnWorkerDoWork;
_Worker.WorkerSupportsCancellation = true;
this.Shown += OnFormMainShown;
}
void OnFormMainShown(object sender, EventArgs e)
{
_Worker.RunWorkerAsync();
}
void OnWorkerDoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < 100; i++)
{
if (_Worker.CancellationPending)
{
return;
}
Thread.Sleep(100);
listBox1.Invoke((Action<int>)AddItem, i);
}
}
private void AddItem(int i)
{
listBox1.Items.Add(i);
}
private void button1_Click(object sender, EventArgs e)
{
_Worker.CancelAsync();
}
}