none
关于datagrid显示及绑定的一些问题。 RRS feed

  • 问题

  • 我这边有一组2维数据要在表格中显示出来,由于数组的行和列都不是固定的(程序运行过程中,可能根据用户设置来改变行数和列数),

    所以再XAML中不会绑定数据(网上的绑定例子,column都固定的),后来使用datatable,发现可以绑定并显示数据。

    实际过程中,我是开一个线程从硬件读取这组二维数据的,测试时候用random模拟了一下显示效果:

              for (int i = 0; i < _data.Rows.Count; ++i)
              {
                for (int j = 0; j < _columns; ++j)
                {
                  _data.Rows[i][j] = random.Next(0, 999);//_data是一个datatable
                 }
              }

    数据更新效果还可以,但是CPU占用率较大,而且当行和列相对较大时(也就20行,20列),整个数据刷新速度就感觉比较慢。

    有没有办法控制datagrid的刷新?比如每秒只刷新60次这样的?但是一些关键帧要刷新,比如出现异常数据,就立刻刷新...

    不知道我说的比较清楚没,事实上,这个功能在mfc下做,CPU实用率10%左右,我用wpf实现,用了50%的cpu占用率...

    最后再问一下,如何对datatable取值?我存放的是int数据,取的时候是Convert.toInt32(_data.Rows[i][j].toString()),感觉

    很累赘啊,没有简单点的方法么?

    2013年11月1日 2:13

答案

  • 您好,

    >>有没有办法控制DataGrid的刷新?比如每秒只刷新60次这样的?但是一些关键帧要刷新,比如出现异常数据,就立刻刷新...

    楼上的建议是可行的。我们可以使用INotifyPropertyChanged接口来实现,还有一种方式也不错,使用ObservableCollection<T>来实现。这里有一个关于ObservableCollection<T>的例子

    http://msdn.microsoft.com/en-us/library/ms748365.aspx

    >>这个功能在MFC下做,CPU实用率10%左右,我用WPF实现,用了50%CPU占用率.

    因为我不清楚你的具体代码,从你贴出的代码来看这个占用CPU应该不会很高,只是一个随机数。下面推荐你一片比较好的文章,关于WPF Performance这一块的. 你可以重点看一下将WPF Data Binding这一块的内容。

    http://msdn.microsoft.com/en-us/library/aa970683.aspx

    >>如何对DataTable取值?我存放的是int数据,取的时候是Convert.toInt32(_data.Rows[i][j].toString()),感觉很累赘啊,没有简单点的方法么?

    如果不使用ToString(),从DataTable中取出来的就直接是一个DataRow对象。对于是否需要转换为int型的数值,这个要看你赋值的地方。其实有简单的方法实现的,不过据我个人经验而言那样性能不高。我们可以使用强类型的DataSet来实现。相当于我们预先定制好一个DataTable,告诉这个DataTable哪一行是int型数值,哪一行是string类型的。然后访问时就非常简单了。具体可以参考下面链接,

    http://msdn.microsoft.com/en-us/library/esbykkzb.aspx

    希望我的回复能够帮到您!

    谢谢!


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2013年11月4日 2:19
    版主

全部回复

  • 这是问题在于刷新整个集合是一个非常占用内存操作,因为在这个过程中,会丢弃现有对象,再重建很多对象

    你可以通过重写INotifyPropertyChanged了InotifyCollectionChanged接口来选择更新以提高性能。

    2013年11月4日 1:21
  • 您好,

    >>有没有办法控制DataGrid的刷新?比如每秒只刷新60次这样的?但是一些关键帧要刷新,比如出现异常数据,就立刻刷新...

    楼上的建议是可行的。我们可以使用INotifyPropertyChanged接口来实现,还有一种方式也不错,使用ObservableCollection<T>来实现。这里有一个关于ObservableCollection<T>的例子

    http://msdn.microsoft.com/en-us/library/ms748365.aspx

    >>这个功能在MFC下做,CPU实用率10%左右,我用WPF实现,用了50%CPU占用率.

    因为我不清楚你的具体代码,从你贴出的代码来看这个占用CPU应该不会很高,只是一个随机数。下面推荐你一片比较好的文章,关于WPF Performance这一块的. 你可以重点看一下将WPF Data Binding这一块的内容。

    http://msdn.microsoft.com/en-us/library/aa970683.aspx

    >>如何对DataTable取值?我存放的是int数据,取的时候是Convert.toInt32(_data.Rows[i][j].toString()),感觉很累赘啊,没有简单点的方法么?

    如果不使用ToString(),从DataTable中取出来的就直接是一个DataRow对象。对于是否需要转换为int型的数值,这个要看你赋值的地方。其实有简单的方法实现的,不过据我个人经验而言那样性能不高。我们可以使用强类型的DataSet来实现。相当于我们预先定制好一个DataTable,告诉这个DataTable哪一行是int型数值,哪一行是string类型的。然后访问时就非常简单了。具体可以参考下面链接,

    http://msdn.microsoft.com/en-us/library/esbykkzb.aspx

    希望我的回复能够帮到您!

    谢谢!


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2013年11月4日 2:19
    版主