すべての行Grid Aを含む最初の DataGridView と、新しい行Grid Bのみを表示する DataGridViewを呼び出しましょう。グリッド A への変更を観察してグリッド B の内容を定義しないでください。代わりに、「新しい行」とは何かについて独自の定義を作成してください。これを行う簡単な方法の 1 つは、更新のたびに (SqlDependency オブジェクトの OnChange イベントで) グリッド A のコンテンツのコピーを作成することです。次に、次の更新で、行を選択して「新しい行」DataSet に入れることができるようになります。
SqlDependency オブジェクトの OnChange ハンドラーの疑似コードを次に示します (これは、グリッド A を満たす SqlCommand を監視する必要があります)。
- Grid A データソースから行を選択する SqlCommand を実行し、 LastUpdateという 2 番目のテーブルの ID を持つ行を除外する NOT IN 句を使用します(手順 2 を参照)。これがグリッド B のデータ ソースになります。
- Grid A データ ソースのすべての行を LastUpdate テーブルにコピーする SqlCommand を実行します。最初に LastUpdate の内容を削除してから、次の形式のステートメントを実行するのが最も簡単な場合があります。
INSERT INTO LastUpdate(ID) SELECT ID FROM table_x
- グリッド A を正常に更新します。
強調したい点は、この更新戦略によって、データ クエリと UI が効果的に分離されるということです。言い換えれば、グリッド B を駆動するデータは、グリッド A にまったく依存しません。この原則に固執すれば、はるかに保守しやすいアプリケーションにたどり着くはずです。