0

datagirdview を埋めるバックグラウンドワーカーを作成しました。DatagridView は、テーブルから 2000 レコードを取得するリストを使用して埋められます。バックグラウンド ワーカーを使用して、応答しない UI を削除しました。

private BackgroundWorker worker;
worker = new BackgroundWorker() { WorkerReportsProgress = true };
worker.DoWork += worker_DoWork;
worker.RunWorkerAsync();

void worker_DoWork(object sender, DoWorkEventArgs e)
{
    var listAccGroups = vwAccVoucherDetails.ToList(); // vwAccVoucherDetails is the table containing records.
    dgvBalanceSheet.DataSource = listAccGroups;
}

私が得ているエラーは次のとおりです。

クロススレッド操作が無効です: コントロール 'dgvBalanceSheet' は、それが作成されたスレッド以外のスレッドからアクセスされました。

この種のエラーを発生させずに datagridView のデータソースを設定するにはどうすればよいですか?

4

3 に答える 3

3

BackgroundWorkerのCompletedイベントを使用する必要があります。

BackgroundWorker worker = new BackgroundWorker() { WorkerReportsProgress = true };
worker.DoWork += worker_DoWork;
worker.Completed += worker_Completed;
worker.RunWorkerAsync();

void worker_DoWork(object sender, DoWorkEventArgs e)
{
    e.Result = vwAccVoucherDetails.ToList(); // vwAccVoucherDetails is the table containing records.
}

void worker_Completed(object sender, RunWorkerCompletedEventArgs e) {
  dgvBalanceSheet.DataSource = e.Result;
}

BackgroundWorker クラスの使用方法の詳細な手順については、このチュートリアルの手順に従ってください。

于 2013-09-23T10:08:43.513 に答える
0

バックグラウンド ワーカーでProgressChangedまたはコールバックを使用します (イベント処理と同様)。これは UI スレッドで実行されるため、現在発生している問題は発生しません。RunWorkerCompletedDoWork

于 2013-09-23T10:08:30.453 に答える