在我的应用程序中,我在backgrounworker线程中更新了一个树视图。在更新树视图时,组合框值不可见。更新树视图后,将显示值。
这是我的背景工作代码:
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";
}
组合框填充在表单的构造函数中。
我将树视图放在一个单独的线程中的原因是因为必须更新树视图。与此同时,我想继续使用该应用程序。因此我需要访问组合框。但是在更新树视图时,组合框的值是不可见的。
如何解决这个问题?
答案 0 :(得分:1)
我不太确定你的帖子中有足够的信息来完全回答这个问题...但是假设你在调用FillCategoryCombo()方法之前在构造函数中创建了后台工作线程......这很有意义
在你的后台工作者方法中,你立即调用Invoke,它将控制权切换回UI线程,然后在FillCategoryCombo()有机会运行之前,它将执行FillCategoryTreeView()的工作。
如果要异步填充树视图(假设它来自长时间运行的数据库调用),那么当您特别需要添加树视图项时,您需要做的是在FillCategoryTreeView中实际具有单独的Invoke调用。这样,当每个数据库调用(或任何花费很长时间)完成时,它只在需要添加物理树节点时在UI线程上执行操作。