2009-07-27 3 views
0

仮想モードのデータグリッドから行のリストを取得すると例外が発生します(下記参照)。これは画面に表示できる行数より多くの行がある場合にのみ発生します。それは毎回発生しません。私が仮想モードに関して欠けているものはありますか?仮想モードのデータグリッドから行を取得する際の例外

更新>下の図は問題を示しています。インデックスがリストの範囲外になりました。その理由は、私は10項目を持っていると私は彼らが必要とされていないとして私は5を非表示と私は5にいくつかのコードが表示され、5つの項目がありますが、インデックスを再作成できますか?私は可視5にいくつかのコードを実行した後、私は隠された5を表示するので、私はこれらをdisgardしたくない、私は再び見えるときに再インデックスする必要があるだろう。どうもありがとう。

alt text http://i28.tinypic.com/23iyp95.png

+0

遅くなる可能性があり、これは本当かのどちらかであります他の行ではfalseです。 –

+0

私は新しい写真が問題をはっきりと示しているので、古い写真を削除しました。再インデックスする必要があります。どうすればいいですか?ありがとう –

+0

これについてのどんな助けも非常に高く評価されるでしょう。ありがとう –

答えて

0

私だけのDataGridViewで仮想モードを使用しましたが、仮想モードでは、データを自分で保存し、データグリッドは、レンダリングのために必要がある場合にそれを提供することになっています。私は、datagridは、ビューを埋めるために必要な最小限のアイテムを作成してから、パフォーマンス上の理由からそれらを再利用すると仮定します。

0

これは私にとってスレッドの問題のように見えます。 BackgroundWorkerなどを使用して、_items変数を設定していますか?あなたがループしている間に_items内のものの数が変化しているように見えます。

おそらく、あなたはこれで_itemsを扱う任意およびすべてのコードを囲む試みることができる:、

また
lock (_items) 
{ 
    // your code 
} 

これらの関数から抜け出すと、あなたの人口/変更コードは、まだいくつかの種類を使用します(実行している場合はnullを返しますブール値のセンチネル変数)。

0

どのようにデータバインディングを設定しましたか?

データグリッドを経由するのではなく、基礎となるデータセットに対して作業することは可能でしょうか。

+0

こんにちはシラーズ、それは長い話ですが、私は理想的には私が既にDataGridに持っているデータを使用する必要があります。 –

0

DataGridViewの仮想モードの制限に注意してください。メモリ消費量が少ないとはいえ、可視の行だけがデータベースからロードされます。各行は独自のインスタンスを持ちます(各DataGridView行のサイズを変更しようとすると、行のサイズは互いに独立して設定できるため、各行の情報(RowHeightなど)はそれぞれのメモリに保存する必要があります)

RowCountを設定すると、の行番号がRowCountで指定したものからインスタンス化されます。このように、DataGridViewの仮想モードの元の目的の1つ、つまりメモリの消費量を犠牲にしています。あまりにも多くのメモリ消費量は、あなたのデータグリッド表示

は、私が失敗した行に対してnullとして値を示す第三の写真を追加しましたhttp://www.codeproject.com/KB/grid/DataGridView_Billion_Rows.aspxここに私の記事を参照してください、そして他の物品http://social.msdn.microsoft.com/Forums/en-US/winformsdatacontrols/thread/243a81e7-909b-4c8e-9d28-6114248cf66e

関連する問題