4

実装に関するアドバイスの一般的な質問。

にバインドされたコレクションがありdatagridviewます。

BindingList<Line> allLines = new BindingList<Line>();
dataGridView1.DataSource = allLines;

virtual modeコレクションには何百万ものエントリ(オブジェクト)が含まれる可能性があるため、実装したいのでLine、一度に必要ないくつかのエントリのみを「キャッシュ」または表示する方が速いと考えました。仮想モードの目的は何ですか?

私が見た:http://msdn.microsoft.com/en-us/library/2b177d6d.aspx

datagridviewしかし、それを機能させることはできませんdatabound

行数を指定できません:

this.dataGridView1.RowCount = 20;
`RowCount property cannot be set on a data-bound DataGridView control.`

編集: このリンクは、バインディングを完全に削除する必要があるかもしれないことを示唆しています。これは事実ですか?http://msdn.microsoft.com/en-us/library/ms171622.aspx

「バウンド モードがパフォーマンスのニーズを満たさない場合は、仮想モード イベント ハンドラーを使用してカスタム キャッシュ内のすべてのデータを管理できます。」

4

1 に答える 1

8

DataGridView.VirtualModeを使用する場合は、バインドされたデータ セットを使用する必要はありません。それらは反対です。したがって、 を設定するのではなく、プロパティを設定して、 DataGridView.CellValueNeeded Eventのイベント ハンドラーを提供するDataSourceだけです。RowCount

dataGridView.VirtualModeプロパティを最初に設定する必要があることに加えてtrue、おそらくデザイナーに書き込む必要があります。デフォルトでは に設定されてfalseいるため、 を設定できないという例外が発生しますRowCount

おそらく、グリッドの列を手動で初期化する必要があります。

グリッドを更新している間 (たとえば、ボタンのクリック時)、次のことを行う必要があります。

dataGridView.RowCount = 0;
\\refresh your cache, where you store rows for the grid
\\...
dataGridView.RowCount = yourCache.Count;//or some other property, getting the number of cached rows.

RowCount と列数に応じて、各行のCellValueNeeded各列に対してイベントが発生します。e.Valueと に応じて、イベント ハンドラーで処理されたセルの値を設定する必要がe.RowIndexありe.ColumnIndexます。

したがって、これが機能するには、少なくとも を処理する必要がありますCellValueNeeded。DataGridView が読み取り専用の場合、他のイベントは必要ありません。

より完全で連続した概要は、Windows フォーム DataGridView コントロールの仮想モードで利用できます。

于 2012-10-24T13:32:04.067 に答える