2012-03-31 37 views
2

我想在从数据库表中获取列后,在组合框中添加项目。为了实现性能我已经把这个任务在新创建的线程使用另一个线程将数据从数据库加载到组合框中

for (int i = 0; i < dataTable.Rows.Count; i++) 
{ 
    comboBox.Items.Add(dataTable.Rows[i][0].ToString()); 
} 

,但它提供了以下异常:

“跨线程操作无效”我搜索了它,并试图

用不同的方法帮助解决这个问题,代表们。我试图将整个dataTable传递给另一个方法,但无法解决问题。

请告诉我如何解决它?

+0

WinForms或WPF? – Tudor 2012-03-31 14:59:17

回答

0

您可以(也可能应该)在后台线程上运行数据库查询,但您必须更新UI线程上的UI控件。这只是Windows的工作方式。

0

你的线程不是UI线程。只有UI线程可以访问UI控件,比如你的组合框 所以你的方法来更新组合框项目应该检查它是否从UI线程调用,并且(如果没有)在尝试使用组合框之前切换到该线程。

public delegate void OnAddTable(DataTable dataTable); 

private void AddTable(DataTable dataTable) 
{ 
    if(this.InvokeRequired) 
    { 
     this.BeginInvoke(new OnAddTable(AddTable), new object[] {dataTable})); 
     return; 
    } 
    for (int i = 0; i < dataTable.Rows.Count; i++) 
    { 
     comboBox.Items.Add(dataTable.Rows[i][0].ToString()); 
    } 
} 
3

简单地包裹在传递给BeginInvoke委托代码:

comboBox.BeginInvoke(
    (Action)(() => 
    { 
     for (int i = 0; i < dataTable.Rows.Count; i++) 
     { 
      comboBox.Items.Add(dataTable.Rows[i][0].ToString()); 
     } 
    })); 

这种方式,您都转发更新的GUI线程,因为它允许做的GUI变化的唯一线索。

相关问题