1

いくつかのデータソースを持つDataGridViewがあります。ユーザーが指定したいくつかの基準に基づいて、DataGridViewのアイテムをフィルタリングする必要があります。

問題は、データが非常に遅いデータベースにあることです。多くのアイテムについて、アイテム自体に格納されている情報でフィルタリングできます(これは高速です)が、行が表示されるかどうかを判断するためにデータベースにクエリを実行する必要がある場合があります。

したがって、私はBackGroundWorkerを次のように使用します。

  1. DataGridViewの行のコピーを(CopyToを使用して)作成し、これをRunWorkerAsyncメソッドに渡します
  2. DoWorkメソッドでは、配列内の各DataGridViewRow要素を確認します行内の情報を単純に検索できる場合もあり(たとえば、 DataGridViewRowの列2を読み取る)、データベースにクエリを実行する必要がある場合もあります。
  3. 行が表示されるかどうかがわかるたびに、行番号(DataGridViewRow要素の渡された配列内の位置)と、可視性を設定するReportProgressメソッドへの可視性を示すブール値で構成されるタプルを送信します。 DataGridView。

(CopyToを使用して)コピーする理由は、別のスレッドからDataGridViewsRowCollectionにアクセスしないようにするためです。

これはすべてうまくいきますが、これが本当に悪い方法であるかどうか本当に疑問に思っています。

  • このようにRowCollectionを操作するのは本当に悪い習慣ですか?
  • よろしければ、CopyToを使う必要がありますか?私がそうする理由は、リストが参照によって渡されるためであり、別のスレッドからUIにアクセスすることを避けたかったからです。

御時間ありがとうございます。

4

1 に答える 1

1

あなたのGUIは、バックグラウンドワーカーにとってデータベースに対してきつすぎると思います。

BindingList<T>一般的に、私はデータベースを経由するのではなく、グリッドをバインドしてリストを操作するために使用することを好みます。ただし、データベースから取得するデータがかなり多い場合は、datagridviewの「仮想モード」を有効にして、再びを使用することができますBindingList<T>

お役に立てれば。

編集1:もちろん、DataTablesに対して直接フィルタリングを使用できます...しかし、バックグラウンドワーカーを関与させるべきではないかもしれません。

EDIT2:ビューをデータレイヤーに直接バインドするのではなく、モデルにバインドするチャンスだと思います。BindingList<T>これは、プレゼンテーションレイヤーのデータレイヤーを分離するため、一般的には優れています。さらに、モデルからビューモデルを作成して、グリッドを(MVVMパターン)にバインドすることもできます。しかし、実際にはプロジェクトによって異なります。

于 2012-06-06T16:03:25.200 に答える