0

約数千行を含むDataTableがあり、各行には約20個のフィールドがあります。

さらに、セルの値はライブで変更されます。また、実行中に一部の行が削除され、一部が追加されます。

私が直面している最初の問題は、アプリを開いてDataGrid.DataSource = ..を呼び出すと、最初にDataGridにデータが表示されない場合、アプリを最小化してから、データを表示するためにアプリをオンに戻す必要があることです。 、 なぜこうなった?

2番目の問題は、各行が別々のスレッドから更新されることです。「IndexCorrupted」例外が発生し続けた後、個別のスレッドからdataTableを更新できないことがわかりました。そのため、すべてのセルでクラスを作成し、Listを作成して、スレッドにクラスデータを直接更新させてから、別の単一スレッドでdataTable、それはうまく機能しているように見えましたが、これを行うためのより良い方法はありますか?

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

ありがとう!

4

2 に答える 2

0

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

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

DataTable ではなくクラスを使用する場合と同じように制御できるようになったら、BindingNotifications のタイミングと方法を確認できます。

于 2012-04-15T12:56:07.770 に答える
0

UI が更新されないという最初の問題は、(おそらく) DataGridViewusing を更新することで解決できます。これによりmyDataGridView.Update()、このコントロールのみが更新/更新され、フォーム全体を更新するよりも効率的です (WinForms を使用していると仮定しています)。

2番目の問題の解決策は、採用しているスレッドの種類によって異なります(これは述べていません)。TPL を使用していると仮定すると、別のスレッドで実行しているメソッド内から soDataGridViewを使用して、へのデータの挿入を行うことができます。TaskSheduler

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

TaskSchedulerUI スレッドから定義されます。

TaskScheduler _uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();

非同期メソッドに渡されます。これが役立つことを願っています。

于 2012-04-15T13:01:58.263 に答える