2012-03-31 62 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變化的唯一線索。

相關問題