2012-03-31 14 views
2

データベーステーブルから列を取得した後、コンボボックスに項目を追加したいとします。性能を達成するために、私は、新しく作成されたスレッド別のスレッドを使用してデータベースからコンボボックスにデータをロード

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

でこのタスクを配置しているが、それは次の例外与える:私はそれを検索してみました

「クロススレッド操作有効ではありません」

をさまざまな方法の助けを借りてこの問題を解決するために、代議員。私はdataTable全体を別のメソッドに渡そうとしましたが、問題を解決できませんでした。

どうすれば解決できますか教えてください。

+0

WinFormsまたはWPF? – Tudor

答えて

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上の変更を行うことが許可された唯一のスレッドだからです。

関連する問題