2010-02-25 94 views
-1

在我的应用程序中,我更新了backgrounworker线程中的一个treeview。在更新树视图时,组合框值不可见。当树视图更新时,会显示值。C#组合值在线程准备就绪后可见

这里是我的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"; 
} 

组合框填充在窗体的构造函数。

我把树视图放在一个单独的线程中的原因是因为树视图必须更新。在此期间,我想继续使用该应用程序。因此我需要访问组合框。但是树形视图正在更新时,组合框的值不可见。

该怎么做才能解决这个问题?

+1

什么问题?你只告诉我们你做了什么,有什么问题,但现在什么... 如果你只调用一个UI调用,使用backgroundWorker有什么意义? – Peter 2010-02-25 14:23:20

回答

1

我不太确定您的文章中是否有足够的信息来完全回答问题......但假设您在调用FillCategoryCombo()方法之前在构造函数中创建了后台工作线程......这使得感。

在您的后台工作方法中,您立即调用Invoke,它将控制切换回UI线程,然后在FillCategoryCombo()有机会运行之前,该线程将执行FillCategoryTreeView()的工作。

如果您想异步填充您的树视图(假设它来自长时间运行的数据库调用),那么当您需要添加树视图项目时,您需要做的实际上是在FillCategoryTreeView中单独调用调用。这样,每次数据库调用(或者需要很长时间)完成时,只需要在UI线程上添加物理树节点时执行操作。