いくつかのデータソースを持つDataGridViewがあります。ユーザーが指定したいくつかの基準に基づいて、DataGridViewのアイテムをフィルタリングする必要があります。
問題は、データが非常に遅いデータベースにあることです。多くのアイテムについて、アイテム自体に格納されている情報でフィルタリングできます(これは高速です)が、行が表示されるかどうかを判断するためにデータベースにクエリを実行する必要がある場合があります。
したがって、私はBackGroundWorkerを次のように使用します。
- DataGridViewの行のコピーを(CopyToを使用して)作成し、これをRunWorkerAsyncメソッドに渡します
- DoWorkメソッドでは、配列内の各DataGridViewRow要素を確認します。行内の情報を単純に検索できる場合もあり(たとえば、 DataGridViewRowの列2を読み取る)、データベースにクエリを実行する必要がある場合もあります。
- 行が表示されるかどうかがわかるたびに、行番号(DataGridViewRow要素の渡された配列内の位置)と、可視性を設定するReportProgressメソッドへの可視性を示すブール値で構成されるタプルを送信します。 DataGridView。
(CopyToを使用して)コピーする理由は、別のスレッドからDataGridViewsRowCollectionにアクセスしないようにするためです。
これはすべてうまくいきますが、これが本当に悪い方法であるかどうか本当に疑問に思っています。
- このようにRowCollectionを操作するのは本当に悪い習慣ですか?
- よろしければ、CopyToを使う必要がありますか?私がそうする理由は、リストが参照によって渡されるためであり、別のスレッドからUIにアクセスすることを避けたかったからです。
御時間ありがとうございます。