找回密码
 立即注册

QQ登录

只需一步,快速开始

FBAccount

中级会员

21

主题

73

帖子

701

积分

中级会员

积分
701

活字格认证

FBAccount
中级会员   /  发表于:2014-12-3 11:44  /   查看:11041  /  回复:13
版主好~~
首先请教当我一页多笔数据时,并且使用大量自定义控件,如C1Number混合多Buttons,在使用键盘PageDown或PageUp时效率很差
例子的话,以之前版主写的Demo [UnboundCellFactory.4],放大到全画面,使用PageDown或是PageUp,整个效率就很卡~

且请教我采用C1 WPF 给的Sample,其中C1Flexgrid ItemsSource 放入ListCollectionView
举例
public class QCollectionView : ListCollectionView
{
   public QCollectionView(System.Collections.IList list) : base(list) {  }
   new public NotifyCollectionChangedEventHandler CollectionChanged;
   protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
   {
       base.OnCollectionChanged(e);
       if (CollectionChanged != null)  CollectionChanged(this, e);
   }
}

QCollectionView  view = new QCollectionView(放入Class);
_flex.ItemsSource = view;

当我新增一笔数据时,必须 view.Refresh() ,在画面上才能呈现新增的那一笔资料
请问有其他方式吗?? Refresh会刷新整个画面~ 不会太消耗效能吗??

p.s. 我的分辨率是 1920 x 1080

13 个回复

倒序浏览
Alice
社区贡献组   /  发表于:2014-12-3 13:59:00
沙发
回复 1楼FBAccount的帖子

你好。
你的意思是在你的代码基础上,希望我提供一种不耗效能的方法?
我们之前没有尝试过在WPF平台下放置这么多自定义控件,所以需要调查。
首先,需要按照你的代码搭建,你有现成的Demo可以提供给我们,我们帮你验证看看有什么提升的方法?
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
FBAccount
中级会员   /  发表于:2014-12-3 14:42:00
板凳
回复 1楼FBAccount的帖子

你好。
你的意思是在你的代码基础上,希望我提供一种不耗效能的方法?
我们之前没有尝试过在WPF平台下放置这么多自
Alice 发表于 2014-12-3 13:59:00


您好,我用您之前发在此帖的DEMO
http://gcdn.gcpowertools.com.cn/showtopic-14235.html
最大化后使用键盘 PageDown or PageUp,会有效能上的问题。



其次想问的是用了ItemSource后,新增、删除除了 Refresh() 外,是否没有其他更新可视组件的机制?

此两问题独立,主要是想解决第一个问题

注1:我这边没有可以用的DEMO,全是由MFC动态加载C# DLL进来使用的。
注2:我的屏幕分辨率是1920x1080
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2014-12-3 16:31:00
地板
回复 3楼FBAccount的帖子

1.对于PageUp/PageDown的性能问题,我将这个问题优先级提高,帮你做了进一步提高性能的验证。
对于性能问题,主要是在WPF下画法的损耗,这是WPF平台的Limitation。这点我在上个帖子已经提到,此处不多做阐述。
对于提高性能,对继承CellFactory类的代码进行了优化处理。主要是两个方面:一是建立堆栈缓存数据,不用每次在CreateCell都重新new一个对象。二是重写DisposeCell方法,将其Dispose掉,然后把内容置于堆栈保存。
在我上一个帖子给的Demo基础上,进行尝试。
具体代码如下,在CellFactory类中,为每一个自定义的Cell类型都创建一个堆栈:
  1.     private Stack<CheckCell> checkCellStack = new Stack<CheckCell>();
  2.         private Stack<FaultCell> faultCellStack = new Stack<FaultCell>();
  3.         private Stack<TestTypeCell> testTypeCellStack = new Stack<TestTypeCell>();
复制代码


重写DisposeCell。
  1. public override void DisposeCell(C1FlexGrid grid, CellType cellType, FrameworkElement cell)
  2.         {
  3.             var bdr = cell as Border;
  4.             if (bdr != null)
  5.             {
  6.                 var tb = bdr.Child as TextBox;
  7.                 if (tb != null)
  8.                 {
  9.                     tb.TextChanged -= tb_TextChanged;
  10.                 }
  11.             }

  12.             Border border = cell as Border;
  13.             if (border != null)
  14.             {
  15.                 var content = border.Child;
  16.                 if (content is CheckCell)
  17.                 {
  18.                     checkCellStack.Push(content as CheckCell);
  19.                 }
  20.                 if (content is FaultCell)
  21.                 {
  22.                     faultCellStack.Push(content as FaultCell);
  23.                 }
  24.                 if (content is TestTypeCell)
  25.                 {
  26.                     testTypeCellStack.Push(content as TestTypeCell);
  27.                 }
  28.             }
  29.             base.DisposeCell(grid, cellType, cell);
  30.         }
复制代码


StoreValue方法用来存值
  1.     public static void StoreValue(FrameworkElement e, object value)
  2.         {
  3.             var grid = Util.GetParentOfType(e, typeof(C1FlexGrid)) as C1FlexGrid;
  4.             var bdr = Util.GetParentOfType(e, typeof(Border)) as Border;
  5.             if (grid != null &amp;&amp; bdr != null)
  6.             {
  7.                 int row = (int)bdr.GetValue(Grid.RowProperty);
  8.                 int col = (int)bdr.GetValue(Grid.ColumnProperty);
  9.                 grid.Select(row, col);
  10.                 grid[row, col] = value;

  11.                 var cf = grid.CellFactory as MyCellFactory;
  12.                 cf.OnCellValueChanged(row, col);
  13.             }
  14.         }
复制代码


就此,在我这里性能有提升。
你可以尝试这种方式,对你的应用程序进行优化。

2.第二个问题,我这里还需要做一些验证,需要些时间才能给你反馈,还望谅解。

评分

参与人数 1满意度 +5 收起 理由
FBAccount + 5 谢谢,效能有所提升

查看全部评分

请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
FBAccount
中级会员   /  发表于:2014-12-3 17:30:00
5#
回复 3楼FBAccount的帖子

1.对于PageUp/PageDown的性能问题,我将这个问题优先级提高,帮你做了进一步提高性能的验证。
对于性能
Alice 发表于 2014-12-3 16:31:00


非常感谢~~~ 还请给我较详细的代码,我进行研究一下,感谢感谢
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2014-12-3 19:03:00
6#
回复 5楼FBAccount的帖子

附件里是解决方案的Demo,是根据上次发给你的Demo修改的。
你先研究下,如果有什么问题,请提出来我们再进行讨论。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
FBAccount
中级会员   /  发表于:2014-12-4 11:41:00
7#
回复 3楼FBAccount的帖子

1.对于PageUp/PageDown的性能问题,我将这个问题优先级提高,帮你做了进一步提高性能的验证。
对于性能
Alice 发表于 2014-12-3 16:31:00


版主妳好,真的非常感谢您的解答~
目前使用妳的DEMO,有个疑问是TestType选择RadioButton后移动拖曳等,其RadioButton 有时不会在同一个位置上面

看流程,画面起始会先new Class,之后Dispose存入Stack;但在画面上操作如RadioButton点选时,因为Stack Pop出来后 还未Dispose,因此会再new Class~

但这样跟数据UI不再同一个位置上面有关系吗?
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2014-12-4 13:59:00
8#
回复 7楼FBAccount的帖子

只能RadioButton才会出现这类问题么?移动拖拽是指拖动scrollbar?
我用这个Demo看下哪里有问题,今天下班前给您一个此问题反馈。
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
FBAccount
中级会员   /  发表于:2014-12-4 15:20:00
9#
回复 7楼FBAccount的帖子

只能RadioButton才会出现这类问题么?移动拖拽是指拖动scrollbar?
我用这个Demo看下哪里有问题
Alice 发表于 2014-12-4 13:59:00


目前是Radio Button才有出现这类状况,其余是有些前面的CheckBox不能勾选~

不过这样不影响,整体来说效率有提升,虽然同样大画面还是有点卡
但卷轴比较好拖了,PageDown or PageUp 在大画面下运行到某一阶段稍卡

单箭头上下则较无问题,整体跟之前比效率确实有所提升

上下拉来拉去时(键盘或Scroll bar)内存方面吃的比较多;若删除其中某一笔数据,Stack中的Control有办法进行释放吗??

真的很感谢,有提升了
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2014-12-4 16:26:00
10#
回复 9楼FBAccount的帖子

对你提到了两个问题进行了测试,是我测试程序本身的bug,和提升性能的代码无关。
CheckBox不能选择的bug,我已经修复,将原来的代码:
  1. var checkCell = GetCheckCell(val is bool ? (bool)val : false);
复制代码

改成:
  1. var checkCell = GetCheckCell(val is int ? (int)val &gt; 0 : false);
复制代码

就可以正常选择。

第二个问题Raido选择后滚动,该位置不正确。是由于测试程序里自定义的TestType这个类型没有StoreValue。
很抱歉给你带来了困扰,由于当时写的是测试程序,里面或多或少会存在一个bug。
如果你在应用到自己的程序里的时候,发现问题,我们再有针对的进行解决。
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部