0

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

更新> 下の画像は問題を示しており、インデックスがリストの範囲外になっています。この理由は、10 個のアイテムがあり、5 個は不要であるため非表示にしており、表示されている 5 個のコードを実行したい場合、現在 5 個のアイテムがありますが、一部のインデックスはおそらく 5 ~ 9 です。インデックスを再作成できますか? 表示されている 5 でいくつかのコードを実行したら、非表示の 5 を表示するので、これらを無視したくありません。すべて表示されたら、再度インデックスを作成する必要があります。どうもありがとう。

代替テキスト

4

4 に答える 4

0

DataGridViewの仮想モードの制限に注意してください。想定される低メモリ消費機能にもかかわらず(表示されている行のみがデータベースからロードされます)。各行には独自のインスタンスがあります(証明するために、各DataGridView行のサイズを変更してみてください。行のサイズは互いに独立して設定できるため、各行の情報(RowHeightなど)を独自のメモリに保存する必要があります)

RowCountを設定すると、RowCountで指定した行からn個の行がインスタンス化されます。したがって、DataGridViewの仮想モードの本来の目的の1つである、メモリ消費量の削減を無効にします。メモリ消費量が多すぎると、データグリッドの表示が遅くなる可能性があります

ここにある私の記事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

于 2010-04-21T10:19:45.490 に答える
0

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

おそらく、これで _items を扱うすべてのコードを囲むことができます:

lock (_items) 
{
    // your code
}

または、これらの関数を中断して、人口/変更コードがまだ実行されている場合は null を返します (おそらく、何らかのブール値のセンチネル変数を使用します)。

于 2009-07-27T14:03:48.023 に答える
0

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

于 2009-07-27T13:56:50.047 に答える