【问题标题】:Get rid of invisible UltraGridRow instances摆脱不可见的 UltraGridRow 实例
【发布时间】:2012-03-01 10:21:37
【问题描述】:

我有一个总共显示数万行的网格,显然用户在任何时间点只查看这些行的一小部分,通常在 10~20 行左右。

我启用了 LoadOnDemand,它确保 UltraGridRow 实例和其他几个对象只有在它们移动到可见区域时才会被创建:

grid.DisplayLayout.LoadStyle = LoadStyle.LoadOnDemand;

这很好用(根据我的内存分析器),但是当我向上和向下滚动整个表时,即触发为所有行创建 UltraGridRows,所有 UltraGridRows 都将被创建并永久保留在内存中。

我怎样才能(最好是自动,但如果不是手动)摆脱视图中行的 UltraGridRow 对象? (或者干脆去掉所有 UltraGridRows - 无论如何它们都会自动重新创建)

我想出的一种蛮力方法是:

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

虽然它会引起一些副作用,那么还有其他方法可以摆脱 UltraGridRows 吗?

顺便说一句,我尝试了这两个家伙,但没有成功(尝试 truefalse 作为 bool 参数)。

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

我正在尝试降低内存消耗,UltraGridRows 目前是主要消费者(UltraGridRows 本身并不是巨大的,它们每个消耗不到 200 字节,在我的情况下这意味着几兆字节,只是让你知道我们在谈论什么)。

这是基础架构 9.2。

有什么想法吗?

【问题讨论】:

    标签: ultrawingrid


    【解决方案1】:

    嗯,总会有反思……

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

    这实际上对我有用,但它会清除选择,因此您必须在调用之前记住这一点并在之后恢复选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-23
      • 1970-01-01
      • 2014-01-20
      • 2019-12-21
      • 2013-07-02
      • 2013-04-20
      • 1970-01-01
      • 2018-01-15
      相关资源
      最近更新 更多