找回密码
 立即注册

QQ登录

只需一步,快速开始

zhuxialiang

论坛元老

25

主题

75

帖子

1万

积分

论坛元老

积分
12575

活字格认证

zhuxialiang
论坛元老   /  发表于:2013-12-17 15:31  /   查看:10629  /  回复:6
C1DataList.ItemsSource = DBTableObj.DefaultView;
DBTableObj大概有100多条记录,通过上述语句进行绑定,但执行需要6-7秒后界面才出现。

对于该现象我想问两个问题:
1)对于100多条记录,更新C1DataGrid控件需要这么长时间吗?
2)如果需要这么长时间,有什么办法提高用户体验(UI)?

6 个回复

倒序浏览
iceman
社区贡献组   /  发表于:2013-12-17 18:28:00
沙发
回复 1楼zhuxialiang的帖子

zhuxialiang 你好,
不好意思,让你久等了。
请问你有多少列数据,列中是否存在模板?
C1DataGrid 的绑定方式如下,你可以通过以下代码测试绑定速度:

  1. public partial class MainWindow : Window
  2.     {
  3.         public MainWindow()
  4.         {
  5.             InitializeComponent();

  6.             List<test> ls = new List<test>();
  7.             for (int i = 0; i < 300; i++)
  8.             {
  9.                 test t = new test();
  10.                 t.A = "test";
  11.                 t.B = "test";
  12.                 t.C = "test";
  13.                 t.D = "test";

  14.                 ls.Add(t);
  15.             }
  16.             Stopwatch st = new Stopwatch();
  17.             st.Start();
  18.             this.c1datagrid.ItemsSource = ls;
  19.             st.Stop();

  20.             long milsecond = st.ElapsedMilliseconds;
  21.         }
  22.     }

  23.     class test
  24.     {
  25.         public string A { get; set; }
  26.         public string B { get; set; }
  27.         public string C { get; set; }
  28.         public string D { get; set; }
  29.     }
复制代码
回复 使用道具 举报
zhuxialiang
论坛元老   /  发表于:2013-12-17 20:52:00
板凳
谢谢,我先按你的方法测试一下,是否有方式:在一个窗口中,一边显示“正在Loading 动画”,一边更新Datagrid控件内容,等到控件内容全部更新好后,在隐藏掉Loading 动画。
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2013-12-18 09:30:00
地板
回复 3楼zhuxialiang的帖子

显示动画的时机可以通过 C1DataGrid Loaded 事件来判断。事件触发即加载结束。
加载动画方式找了一篇资源,推荐参考:http://silverlightchina.net/html/study/WPF/2012/0619/16832.html
回复 使用道具 举报
zhuxialiang
论坛元老   /  发表于:2013-12-18 15:08:00
5#
iceman:您好!
之前对该问题理解不深刻,通过与您交流后,发现或许我之前的表述有问题,我重新描述一下问题:
我有一个窗口,显示数据表内容,大概有100多条记录,先从数据库获取数据到DataTable,在把DataTable内容赋值给C1DataGrid。
1)C1DataList.ItemsSource = DBTableObj.DefaultView语句执行的时间不长,通过Stopwatch发现只有20多个毫秒;
2)执行完上述语句到DataGrid控件显示记录时间较长,该时间与DataGrid控件的大小有关,如果DataGrid控件1024*768,从ItemsSource赋值到控件更新完成需要3秒,如果DataGrid控件大小为500*300,从ItemsSource赋值到控件更新完成需要1秒,上述时间与DataTable的记录数和列数关系不是很大。

本人对该问题的想法和尝试:
从C1DataList.ItemsSource = DBTableObj.DefaultView语句执行后到C1DataGrid控件界面更新,在这段时间里,窗口是假死的。
1)这种假死是否可以通过异步或多线程方式来改善(我试了BackgroundWorker、System.Threading.Timer都没有很好的效果);
2)我本想在C1DataGrid更新期间,执行一段加载动画,以提高UI用户交互效果,但实际在C1DataGrid更新期间,动画也是停止的。

需要达到的效果:
请iceman专家看看,像我这种情况是否有好的解决办法,以提高C1DataGrid控件数据更新期间,用户体验效果。
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2013-12-18 16:25:00
6#
回复 5楼zhuxialiang的帖子

zhuxialiang 您好,

感谢您的详细描述。
在 WPF 和 Silverlight 平台 UI 绘制是影响性能的重要因素,加载时间长短确实和 DataGrid 的大小有关。

您是想通过一些缓冲机制来提高用户体验,例如进度条、Loading 动画等。能否共享你现在的实现 Demo ,我可以在你的 Demo 基础上尝试实现这个功能?
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2013-12-23 10:35:00
7#
回复 5楼zhuxialiang的帖子

请问现在问题进度如何?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部