2012-04-15 20 views
0

私は約2千の行を含むDataTableを持って、各行は約20のフィールドを持っています。DataGridView + DataTable、巨大なリストを処理する最善の方法?

さらに、セルの値は変更されます。また、いくつかの行は削除され、いくつかの行は実行中に追加されます。

最初の問題私が直面してるは、私はオープンアプリを持っているとDataGrid.DataSourceが= .. DataGridのが最初でデータを表示しません呼び出すとき、私はアプリを最小化し、それを取り戻す必要があるということですデータが表示されるために、なぜこれが起こっていますか?

第2の問題は、各行が別のスレッドから更新されることです。私は 'Index Corrupted' Exceptionを続けていました。その後、別のスレッドからdataTableを更新できないことがわかりました。そのため、すべてのセルを含むクラスを作成し、Listを作成し、クラスデータを直接更新し、 dataTableは正常に機能していたようですが、これを行うにはより良い方法がありますか?

基本的に私はDataGridが必要ですが、数千の行が更新/削除/追加されます(スレッドではなくユーザによって追加されます)。これを達成する最良の方法は何ですか?

ありがとうございます!

答えて

0

データテーブルを削除するのは、私の最初の考えです。スレッド(または他の誰か)がバックエンドに行ったこれらの変更をすべて適用する場合は、本当に必要なのは唯一の時間です。

あなたがノックしたこのリストクラス。実装したIListを入手した場合は、DataTableのようにバインドできます。

DataTableではなくクラスを使用するように制御されたら、BindingNotificationsのタイミングと方法を調べることができます。

0

(おそらく)myDataGridView.Update()を使用してDataGridViewを更新することで解決する可能性が更新されないUIの最初の問題は、これが唯一、この制御/更新をリフレッシュし、(私はあなたが使用していることを想定していますフォーム全体をリフレッシュするよりも効率的であるだろうWinForms)。

解決策2番目の問題の解決方法は、どのような種類のスレッドを採用しているか(状態を記述していない)によって異なります。あなたはTPLを使用していると仮定すると、DataGridViewへのデータの挿入は、あなたがTaskSchedulerがから定義されて

Task.Factory.StartNew(() => 
    { 
     source1.DataSource = dtAll; 
     dataGridView1.DataSource = source1; 
    }, CancellationToken.None, TaskCreationOptions.None, _uiScheduler); 

を持つことになりますので、別のスレッドで実行されている方法の中からTaskShedulerを使用して行うことができますUIスレッド経由で

TaskScheduler _uiScheduler = TaskScheduler.FromCurrentSynchronizationContext(); 

経由で送信され、非同期メソッドに渡されます。私はこれが役立つことを願っています

関連する問題