>为了支持用户应用程序,我需要用户控制的排序和过滤,除了智能分页(仅运行查询需要显示的行)和分组.
>到目前为止,我在DataGrID或DataPager中没有看到外部化这些功能,因此可以将过滤,排序和分页参数传递到服务器以构建适当的查询.
>数据集可能相当大;我选择用于原型开发工作的表格可能有一些客户可以有35,000个条目,我相信还有其他表格要大得多,我必须在某些时候处理.所以“智能寻呼”方面至关重要.
想法,建议,指导和nerf砖都欢迎.
解决方法 好的,我花了几天的时间与这个杂草,我想我有一个处理.首先,一件重要的魔法.为了寻呼工作正常,寻呼机必须知道总计数,无论当前查询返回多少个项目.如果查询返回所有内容,则项目数量显然是返回的项目数.对于智能分页,项目计数仍然是可用项目的总数,尽管查询只返回显示的内容.通过过滤,即使每次过滤器更改,可用项目的总数也会更改.
Silverlight Datapager控件具有名为ItemCount的属性.它是只读的,不能在XAML中进行数据绑定,也可以直接在代码中设置.但是,如果包含寻呼机的用户控件具有实现IPagedCollectionVIEw的DataContext,则数据上下文对象必须使用PropertyChanged通知实现ItemCount属性,并且DataPager似乎自动选择此选项.
第二,我强烈推荐Brad Abrams优秀的series of blog posts on RIA Services,特别是ViewModel这个.它包含了大部分需要进行分页和过滤的工作,尽管它缺少管理物品数量的关键部分.他的可下载示例还包含一个非常好的实现ModelVIEwviewmodel(MVVM)的基本框架.谢谢Brad!
所以这里是如何使项目计数工作. (此代码指的是自定义ORM,而Brad的代码则使用Entity Framework;在这两个代码之间,您可以了解您在环境中需要的内容.)
首先,您的ORM需要支持获取记录计数,包括和不使用过滤器.以下是我的域服务代码,使RIA服务可用的计数:
[Invoke]public int GetExamCount(){ return Context.Exams.Count();}[Invoke]public int GetFilteredExamCount(string descriptionFilter){ return Context.Exams.GetFilteredCount(descriptionFilter);}
请注意[Invoke]属性.您不需要返回实体或实体集合的任何DomainService方法.
现在为viewmodel代码.当然,你需要一个ItemCount. (这是从布拉德的例子.)
int itemCount; public int ItemCount { get { return itemCount; } set { if (itemCount != value) { itemCount = value; RaisePropertyChanged(ItemCountChangedEventArgs); } } }
您的LoadData方法将运行查询以获取当前显示的DataGrID行. (这还没有实现自定义排序,但这是一个简单的补充.)
Entityquery<ExamEntity> query = DomainContext.GetPagedExamsquery(PageSize * PageIndex,PageSize,DescriptionFilterText); DomainContext.Load(query,OnExamsLoaded,null);
然后,回调方法运行查询以获取计数.如果没有使用过滤器,我们得到所有行的计数;如果有过滤器,那么我们得到过滤行的计数.
private voID OnExamsLoaded(LoadOperation<ExamEntity> loadOperation){ if (loadOperation.Error != null) { //raise an event... ErrorRaising(this,new ErrorEventArgs(loadOperation.Error)); } else { Exams.MoveCurrentToFirst(); if (string.IsNullOrEmpty(DescriptionFilterText)) { DomainContext.GetExamCount(OnCountCompleted,null); } else { DomainContext.GetFilteredExamCount(DescriptionFilterText,OnCountCompleted,null); } IsLoading = false; }}
还有一个回调方法:
voID OnCountCompleted(InvokeOperation<int> op){ ItemCount = op.Value; TotalitemCount = op.Value;}
使用ItemCount集合,Datapager控件选择它,并且我们进行过滤分页和仅返回要显示的记录的智能查询!
liNQ使用.Skip()和.Take()方便查询.使用原始ADO.NET进行此 *** 作更为困难.我学习了如何通过拆分liNQ生成的查询来做到这一点.
SELECT * FROM (select ROW_NUMBER() OVER (ORDER BY Description) as rownum,* FROM Exams as T0 WHERE T0.Description liKE @description ) as T1 WHERE T1.rownum between @first AND @last ORDER BY rownum
条款“选择ROW_NUMBER()OVER(ORDER BY Description)作为rownum”是有趣的部分,因为没有多少人使用“OVER”.在分配行号之前,此子句对描述进行排序,并且在分配行号之前也应用过滤器.这允许外部SELECT在排序和过滤后对行号进行过滤.
那么就是在RIA Services和Silverlight中进行过滤的智能寻呼!
总结以上是内存溢出为你收集整理的silverlight-3.0 – Silverlight,DataPager,RIA服务和智能分页全部内容,希望文章能够帮你解决silverlight-3.0 – Silverlight,DataPager,RIA服务和智能分页所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)