2010-02-25 3 views
-1

В моем приложении я обновляю древовидную структуру в потоке backgrounworker. При обновлении treeview значения combobox не отображаются. Когда дерево обновляется, появляются значения.C# Значения Combo, видимые после завершения потока

Вот мой BackgroundWorker код:

void _bgWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    tvCategories.Invoke((MethodInvoker)delegate() 
    { 
     FillCategoryTreeView(); // Fills the treeview 
    } 
    ); 
} 

Код, который заполняет мой выпадающий:

private void FillCategoryCombo() 
{ 
    Category categorie = new Category(); 
    List<Category> categories = categorie.GetQuestionCategories(); 

    cmbCategories.DataSource = categories; 
    cmbCategories.DisplayMember = "Description"; 
    cmbCategories.ValueMember = "Id"; 
} 

Поле со списком заполняется в конструкторе формы.

Причина, по которой я поставил дерево в отдельном потоке, состоит в том, что древовидное изображение должно быть обновлено. Тем временем я хочу продолжать использовать приложение. Поэтому мне нужен доступ к выкладке. Но значения combobox невидимы при обновлении древовидной структуры.

Что делать, чтобы решить эту проблему?

+1

В чем проблема? вы только сказали нам, что вы делаете, и что есть проблема, но теперь что ... и что такое использование фона, если вы только вызываете вызов пользовательского интерфейса? – Peter

ответ

1

Я не совсем уверен, что в вашем сообщении достаточно информации, чтобы полностью ответить на вопрос ... но при условии, что вы создаете рабочий поток Background в конструкторе до вызова метода FillCategoryCombo() ... это делает смысл.

В вашем рабочем методе рабочего стола вы сразу вызываете Invoke, который переключает управление прямо в поток пользовательского интерфейса, который затем будет выполнять работу FillCategoryTreeView(), прежде чем FillCategoryCombo() имеет возможность запускать.

Если вы хотите асинхронно заполнить свое древовидное представление (если оно исходит из долгого вызова базы данных), то вам действительно нужно иметь отдельные вызовы Invoke в FillCategoryTreeView, когда вам нужно добавить элемент древовидной структуры. Таким образом, когда заканчивается каждый вызов базы данных (или что-то еще занимает много времени), она выполняет только операцию в потоке пользовательского интерфейса, когда ему нужно добавить физический узел дерева.

Смежные вопросы