怎么选择锦州网站建设,翔安建设局网站,开封公司网站如何制作,wordpress是干嘛的原文#xff1a;http://www.cnblogs.com/scy251147/archive/2012/01/08/2305319.html 由于之前利用Winform的ListView进行大数据量加载的时候#xff0c;诟病良多#xff0c;所以今天试着用WPF的ListView来做了一下#xff0c;结果没有让我失望#xff0c;我将一个拥有430…原文http://www.cnblogs.com/scy251147/archive/2012/01/08/2305319.html 由于之前利用Winform的ListView进行大数据量加载的时候诟病良多所以今天试着用WPF的ListView来做了一下结果没有让我失望我将一个拥有43000行510列的csv文件导入到了ListView中总共耗时在10s左右并且在导入的过程中软件界面上的提示信息一直在提示当前导入了多少条。在整个导入的过程中没有感觉到ListView的闪烁。 在测试大数据量加载的时候我们有两件事情需要完成第一个就是考虑到大数据量我们得利用异步方式来进行否则界面及其容易被阻塞住第二个就是由于数据量过大导入时间可能比较长如何通知用户当前导入的进度。 针对问题一可以考虑利用委托的异步方式进行针对问题二可以考虑到线程和UI交互的方式。 首先要说的是大数据量的导入和WinForm不同的是在导入数据到ListView之前我们需要先将数据导入到一个DataTable中然后利用GridView来处理DataTable最后绑定即可见代码流程 /// summary/// 开始对BindData函数进行异步处理/// /summaryprivate void BeginBindData() { ........ }/// summary/// 对BindData函数进行异步处理完毕向用户发送通知/// /summary/// param nameiar/paramprivate void EndBindData(IAsyncResult iar) { ........ }/// summary/// 考虑到BindData导入数据比较耗时采用了BeginBindData来进行异步加载/// /summaryprivate void BindData() { ........ } 这就是整个异步加载方式的执行流程下面见具体代码 #region Invoke the Binding Data method asynchorously/// summary/// 开始对BindData函数进行异步处理/// /summaryprivate void BeginBindData() { BindDataAsync bindData new BindDataAsync(BindData); IAsyncResult iar bindData.BeginInvoke(new AsyncCallback(EndBindData), bindData); tsStatus.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate { tsStatus.Content 正在加载中。。。; })); }/// summary/// 对BindData函数进行异步处理完毕向用户发送通知/// /summary/// param nameiar/paramprivate void EndBindData(IAsyncResult iar) { tsStatus.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate { tsStatus.Content 加载完毕。。。; })); BindDataAsync bindData (BindDataAsync)iar.AsyncState; bindData.EndInvoke(iar); }/// summary/// 考虑到BindData导入数据比较耗时采用了BeginBindData来进行异步加载/// /summaryprivate void BindData() { GetHeader(); DataTable dt LoadData(); tsStatus.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate { tsStatus.Content 正在绑定数据请稍候。。。; }));//using Dispatcher to avoid crossing thread exception listView1.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate {foreach (DataColumn item in dt.Columns) { GridViewColumn gvc new GridViewColumn();//设置行的绑定源 gvc.DisplayMemberBinding new Binding(item.ColumnName);//设置头部名称 gvc.Header item.ColumnName; gv.Columns.Add(gvc); }//设置显示方式利用GridView来显示 listView1.View gv;//设置待绑定的上下文数据对象 listView1.DataContext dt;//绑定数据不可缺少否则导致绑定失败 listView1.SetBinding(ListView.ItemsSourceProperty, new Binding()); })); }#endregion 其次关于如何向用户发送通知这个涉及到了线程和UI交互在Winform中我们可以通过Control.InvokeRequired来判断是否需要进行交互然后通过Invoke方法进行进一步处理而在WPF中则需要利用Dispacther来进行处理也即Control.Dispacter方法在代码中是这样做到的拿名称为tsStatus的Label控件来说 tsStatus.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate { tsStatus.Content 当前已经加载count条数据。。。; })); 在Action中用了匿名方法来实现非常方便。转载于:https://www.cnblogs.com/hhhh2010/p/8675893.html