回复 3楼FBAccount的帖子
1.对于PageUp/PageDown的性能问题,我将这个问题优先级提高,帮你做了进一步提高性能的验证。
对于性能问题,主要是在WPF下画法的损耗,这是WPF平台的Limitation。这点我在上个帖子已经提到,此处不多做阐述。
对于提高性能,对继承CellFactory类的代码进行了优化处理。主要是两个方面:一是建立堆栈缓存数据,不用每次在CreateCell都重新new一个对象。二是重写DisposeCell方法,将其Dispose掉,然后把内容置于堆栈保存。
在我上一个帖子给的Demo基础上,进行尝试。
具体代码如下,在CellFactory类中,为每一个自定义的Cell类型都创建一个堆栈:
- private Stack<CheckCell> checkCellStack = new Stack<CheckCell>();
- private Stack<FaultCell> faultCellStack = new Stack<FaultCell>();
- private Stack<TestTypeCell> testTypeCellStack = new Stack<TestTypeCell>();
复制代码
重写DisposeCell。
- public override void DisposeCell(C1FlexGrid grid, CellType cellType, FrameworkElement cell)
- {
- var bdr = cell as Border;
- if (bdr != null)
- {
- var tb = bdr.Child as TextBox;
- if (tb != null)
- {
- tb.TextChanged -= tb_TextChanged;
- }
- }
- Border border = cell as Border;
- if (border != null)
- {
- var content = border.Child;
- if (content is CheckCell)
- {
- checkCellStack.Push(content as CheckCell);
- }
- if (content is FaultCell)
- {
- faultCellStack.Push(content as FaultCell);
- }
- if (content is TestTypeCell)
- {
- testTypeCellStack.Push(content as TestTypeCell);
- }
- }
- base.DisposeCell(grid, cellType, cell);
- }
复制代码
StoreValue方法用来存值
- public static void StoreValue(FrameworkElement e, object value)
- {
- var grid = Util.GetParentOfType(e, typeof(C1FlexGrid)) as C1FlexGrid;
- var bdr = Util.GetParentOfType(e, typeof(Border)) as Border;
- if (grid != null && bdr != null)
- {
- int row = (int)bdr.GetValue(Grid.RowProperty);
- int col = (int)bdr.GetValue(Grid.ColumnProperty);
- grid.Select(row, col);
- grid[row, col] = value;
- var cf = grid.CellFactory as MyCellFactory;
- cf.OnCellValueChanged(row, col);
- }
- }
复制代码
就此,在我这里性能有提升。
你可以尝试这种方式,对你的应用程序进行优化。
2.第二个问题,我这里还需要做一些验证,需要些时间才能给你反馈,还望谅解。 |