デリゲートを使用してメインコントロールスレッドのコントロールを更新する方法を理解しました。これは魅力的です。私の問題は、DataGridView
に大量のDataSet
(2000アイテム)を追加すると、グリッドがポピュレートするのに5〜8秒かかり、その間5〜8秒でGUI全体がロックされてしまうのです。 DataGridView
がユーザーインターフェイスをロックしないように更新するにはどうすればよいですか?DataGridViewへのノンブロッキング更新
明確にするため、問題は、私は、データベースに遅いクエリをやってるし、UIがその上でブロックされていることを、私はすでにDataSet object[]
とDataGrid
があるBindingList<object>
にオブジェクトの配列を追加していませんこれにバインド:
BindingList<object> dataProvider = new BindingList<object>();
DataGridView gridView = new DataGridView();
gridView.DataSource = dataProvider;
// ...stuff happens...
object[] source = dataSet; //of 2000 items
foreach (object item in source) { //this foreach blocks
dataProvider.Add(item);
}
私はdataProvider.Add()
をしたデリゲートを作成するように(私は仕事ではないと知っていたが、私は見たい考え出していること)、様々なものを試してみましたが、それはまだしなければならなかったので、それは問題ではありませんでした制御スレッド上で発生します。
最初にBindingList
を構築してからgridView.DataSource
を設定することをお勧めします。これは動作しますが(グリッドを即座に更新します)、データを追加する唯一の方法は、別の新しいBindingList
を作成し、gridView.DataSource.copyTo()
(既存のデータを取得する)を行い、その上に新しいデータを追加してからgridView.DataSource
から新しいBindingList
に変更してください。私のリストのオブジェクトは静的ではないので、サーバにデータを非同期でアップロードし、新しいBindingList
にそれらをコピーすると問題が発生するため、これは私にとってはうまくいかないでしょう。
foreachループは、別のスレッドに行くべきであるが、これはまだ正しい考えです。 – user142350
これはちょっと違いますが、通常のイベントでは通常2000個のアイテムを追加できます。彼らはすでに覚えています。 –
foreachループを別のスレッドに入れようとしましたが、それぞれの.Addがまだ制御スレッド上で発生しているため、foreach全体が制御スレッド上でまだ起きていることを意味しています。 Henkは、すべてのアイテムをBindingListに追加した後、gridView.DataSourceをBindingListに設定した後でインスタント・アップデートを行うようにしています。ここでの問題は、gridViewにアイテムを追加したい場合です。新しいBindingListを作成し、既存のアイテムをすべてコピーして、それに追加する必要があります。これにより、現在のデータで実行中の操作(およびハックのようなもの)が中断されます。 – Shizam