如何在.Net2.0中使用后台工作程序填充ListBox?

时间:2011-02-22 10:00:51

标签: c# .net .net-2.0

在我的应用程序中,在用户将两个以上的字符放入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的更新版本中有技术,我也会很高兴提供一个简短的提示(仅供我参考)。

1 个答案:

答案 0 :(得分:4)

您可以在BackgroundWorker内填写ListBox(不要忘记使用Add()调用BeginInvoke()方法)。在这种情况下,用户可以在填充框时与GUI进行交互。

如果用户在自己的框中添加了某些内容,则可以通过调用worker.CancelAsnyc()来停止自动填充。

更新(与VS 2005兼容)

不幸的是我没有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();
    }
}