Windows フォーム DataGridView コントロールでの仮想モード

仮想モードを使用すると、DataGridView コントロールとカスタム データ キャッシュの間の相互作用を管理できます。 仮想モードを実装するには、VirtualMode プロパティを true に設定し、このトピックで説明する 1 つ以上のイベントを処理します。 通常は、少なくとも CellValueNeeded イベントを処理します。これにより、コントロールでデータ キャッシュ内の値を検索できるようになります。

バインド モードと仮想モード

仮想モードは、バインド モードを補完または置換する必要がある場合にのみ必要です。 バインド モードでは、DataSource プロパティを設定すると、コントロールにより自動的に、指定したソースからデータが読み込まれ、ユーザーによる変更がそれに返送されます。 開発者はどのバインドされた列を表示するかを制御でき、通常、並べ替えなどの操作はデータ ソース自体によって処理されます。

バインド モードの補完

バインドされた列と共にバインドされていない列を表示することにより、バインド モードを補完できます。 これは、"混合モード" と呼ばれることもあり、計算値やユーザー インターフェイス (UI) コントロールなどを表示する場合に便利です。

バインドされていない列はデータ ソースの外部にあるため、データ ソースの並べ替え操作では無視されます。 そのため、混合モードで並べ替えを有効にする場合は、ローカル キャッシュ内のバインドされていないデータを管理し、DataGridView コントロールでそれと対話できるように仮想モードを実装する必要があります。

仮想モードを使用してバインドされていない列の値を維持する方法の詳細については、DataGridViewCheckBoxColumn.ThreeState プロパティと System.Windows.Forms.DataGridViewComboBoxColumn クラスのリファレンス トピックの例を参照してください。

バインド モードの置換

バインド モードでパフォーマンスのニーズが満たされない場合は、カスタム キャッシュ内のすべてのデータを仮想モードのイベント ハンドラーで管理することができます。 たとえば、仮想モードを使用すると、最適なパフォーマンスのために必要なだけのデータをネットワーク データベースから取得する、Just-In-Time データ読み込みメカニズムを実装できます。 このシナリオは、遅いネットワーク接続で大量のデータを処理する場合や、RAM または記憶域スペースの容量が限られているクライアント コンピューターを使用する場合に、特に便利です。

Just-In-Time のシナリオでの仮想モードの使用の詳細については、「Windows フォーム DataGridView コントロールでの Just-In-Time データ読み込みによる仮想モードの実装」を参照してください。

仮想モードのイベント

データが読み取り専用の場合は、CellValueNeeded イベントだけを処理すればよい可能性があります。 その他の仮想モード イベントを使用すると、ユーザーの編集、行の追加と削除、行レベルのトランザクションなど、特定の機能を有効にすることができます。

一部の標準的な DataGridView イベント (ユーザーが行を追加または削除したとき、またはセルの値が編集、解析、検証、書式設定されたときに発生するイベントなど) は、仮想モードでも便利です。 また、イベントを処理すると、セルのツールヒント テキスト、セルと行のエラー テキスト、セルと行のショートカット メニュー データ、行の高さのデータなど、通常であればバインドされたデータ ソースには格納されない値を維持することもできます。

行レベルのコミット スコープで読み取り/書き込みデータを管理するための仮想モードの実装の詳細については、「チュートリアル : Windows フォーム DataGridView コントロールでの仮想モードの実装」を参照してください。

セル レベルのコミット スコープで仮想モードを実装する例については、VirtualMode プロパティのリファレンス トピックを参照してください。

次のイベントは、VirtualMode プロパティが true に設定されている場合にのみ発生します。

Event 説明
CellValueNeeded 表示用にデータ キャッシュからセルの値を取得するために、コントロールによって使用されます。 このイベントは、バインドされていない列のセルに対してのみ発生します。
CellValuePushed セルへのユーザー入力をデータ キャッシュにコミットするために、コントロールによって使用されます。 このイベントは、バインドされていない列のセルに対してのみ発生します。

CellValuePushed イベント ハンドラーの外部でキャッシュされた値を変更し、現在の値がコントロールに表示され、現在有効になっている自動サイズ設定モードが適用されるようにするときは、UpdateCellValue メソッドを呼び出します。
NewRowNeeded データ キャッシュに新しい行が必要であることを示すために、コントロールによって使用されます。
RowDirtyStateNeeded コミットされていない変更が行にあるかどうかを判断するために、コントロールによって使用されます。
CancelRowEdit 行をキャッシュされた値に戻す必要があることを示すために、コントロールによって使用されます。

次のイベントは仮想モードで便利ですが、VirtualMode プロパティの設定に関係なく使用できます。

events 説明
UserDeletingRow

UserDeletedRow

RowsRemoved

RowsAdded
データ キャッシュを適宜更新できるよう、行が削除または追加されたことを示すためにコントロールによって使用されます。
CellFormatting

CellParsing

CellValidating

CellValidated

RowValidating

RowValidated
表示用にセルの値を書式設定し、ユーザー入力を解析および検証するために、コントロールによって使用されます。
CellToolTipTextNeeded DataSource プロパティが設定されている場合、または VirtualMode プロパティが true の場合に、セルのツールヒント テキストを取得するためにコントロールによって使用されます。

セルのツールヒントは、ShowCellToolTips プロパティの値が true の場合にのみ表示されます。
CellErrorTextNeeded

RowErrorTextNeeded
DataSource プロパティが設定されている場合、または VirtualMode プロパティが true の場合に、セルまたは行のエラー テキストを取得するためにコントロールによって使用されます。

セルまたは行のエラー テキストを変更して、コントロールに現在の値が表示されるようにするには、UpdateCellErrorText メソッドまたは UpdateRowErrorText メソッドを呼び出します。

ShowCellErrors および ShowRowErrors プロパティの値が true の場合、セルと行のエラー グリフが表示されます。
CellContextMenuStripNeeded

RowContextMenuStripNeeded
DataSource プロパティが設定されている場合、または VirtualMode プロパティが true の場合に、セルまたは行の ContextMenuStrip を取得するためにコントロールによって使用されます。
RowHeightInfoNeeded

RowHeightInfoPushed
データ キャッシュ内の行の高さの情報を取得または格納するために、コントロールによって使用されます。 RowHeightInfoPushed イベント ハンドラーの外部でキャッシュされた行の高さの情報を変更し、現在の値がコントロールの表示で使用されるようにする場合は、UpdateRowHeightInfo メソッドを呼び出します。

仮想モードでのベスト プラクティス

大量のデータを効率的に処理するために仮想モードを実装している場合、DataGridView コントロール自体も効率的に処理されるようにする必要があります。 セル スタイル、自動サイズ設定、選択、行の共有の効率的な使用に関する詳細については、「Windows フォーム DataGridView コントロールを拡張するための推奨される手順」を参照してください。

関連項目