0

合計で数万行を表示するグリッドがあります。明らかに、ユーザーはいつでもそれらの行のごく一部、通常は約 10 ~ 20 行しか見ていません。

LoadOnDemandを有効にしました。これにより、UltraGridRowインスタンスと他のいくつかのオブジェクトは、可視領域に移動したときにのみ作成されます。

grid.DisplayLayout.LoadStyle = LoadStyle.LoadOnDemand;

これは (私のメモリ プロファイラーによると) うまく機能しますが、テーブル全体を上下にスクロールすると、つまり、すべての行に対して UltraGridRows の作成をトリガーすると、すべての UltraGridRows が作成され、永久にメモリに残ります。

どうすれば (理想的には自動的に、そうでない場合は手動で)、表示されていない行の UltraGridRow オブジェクトを取り除くことができますか? (または、すべての UltraGridRows を取り除くだけで、いずれにせよ自動的に再作成されます)

私が考え出した1つの力ずくの方法はこれです:

var tmp = grid.DataSource;
grid.DataSource = null;
grid.DataSource = tmp;

ただし、いくつかの副作用が発生するため、UltraGridRows を取り除く他の方法はありますか?

ところで、私はこれら2人の男を試しましたが、成功しませんでした( boolパラメータに対してtruefalseを試しました)。

grid.Rows.Refresh(RefreshRow.ReloadData, false, true);
grid.Rows.DeallocateCells(true);

私はメモリ消費を抑えようとしていますが、現在 UltraGridRows が主な消費者です (UltraGridRows 自体は巨大ではなく、それぞれ 200 バイト未満しか消費しません。私の場合は数メガバイトを意味します。について話す)。

これは Infragistics 9.2 です。

何か案は?

4

1 に答える 1

0

うーん、いつも反省点が…

var m = typeof(RowsCollection)
    .GetMethod("InternalClearHelper", BindingFlags.NonPublic | BindingFlags.Instance);
m.Invoke(grid.Rows, null);

これは実際には機能しますが、選択がクリアされるため、後で選択を呼び出して復元する前に覚えておく必要があります。

于 2012-03-01T13:19:02.483 に答える