Добавление элементов управления в WinForms динамически в другом потоке - PullRequest
2 голосов
/ 12 февраля 2009

У меня есть Winform, которая содержит сетку данных, источник привязки, элемент управления проводником и т. Д. *

Мне нужно динамически добавить несколько элементов управления (Custom UserControls) в Panel (например, Panel.Controls.Add (...)). Этот процесс может быть медленным.

Я хочу показать пользователю сообщение (в ожидании).

Какой самый лучший способ? Я использую Backgroundworker, но у меня есть проблемы, мое приложение не отвечает, а в datagridview не отображается вертикальная полоса прокрутки и другие странные вещи.

Ответы [ 2 ]

3 голосов
/ 12 февраля 2009

Поток, вероятно, не лучший вариант для операций с графическим интерфейсом. Все элементы управления должны быть созданы в одном потоке.

Вместо этого поместите элемент управления строки состояния внизу формы. В строке состояния включите индикатор выполнения и метку. При добавлении элемента управления укажите это в строке состояния, включив сообщение в метку и увеличив индикатор выполнения.

2 голосов
/ 12 февраля 2009

Я сомневаюсь, что добавление элементов управления в WinForm может быть медленным. ИМХО, что, вероятно, ухудшает производительность, это выборка данных, которые к ним привязаны. Так, например, вы можете загрузить данные в новый поток и, как только они будут загружены, связать их с элементом управления:

ThreadPool.QueueUserWorkItem(o =>
{
    // Simulate some expensive data fetch.
    Thread.Sleep(1000);
    string[] data = new[] { "value1", "value2" };

    if (InvokeRequired)
    {
        Action a = () => { listBox1.DataSource = data; };
        // Ensure that all UI updates are done on the main thread
        Invoke(a);
    }
});
...