让DataPager分页控件实现服务器端分页

Silverlight4中有一个DataPager分页控件,使用起来非常简单,拖过来,这样设置一下就可以用了,就可以搭配List(比如DataGrid)使用了,真是简单:

最简单的客户端分页
1 PagedCollectionView pcv = new PagedCollectionView(MyEntities /* IEnumerable<T> */ );
2
3   this .dataPager1.PageSize = 10 ;
4
5   this .dataGrid1.ItemsSource = pcv;
6   this .dataPager1.Source = pcv;

然后就可以实现分页了,效果如图:

DataPager+DataGrid

好简单,那我们今天还写什么,文章可以结束了。呵呵。

Fiddler分析了一下客户端和服务端的数据,发现这个DataPager是“客户端分页”。也就是说,如果你数据库有百万数据,都下载到客户端来了,然后在Silverlight客户端做了一把分页,显示当前页数据。这个这个,如果你的数据量不大,这个没有问题,如果数据量大,那就有性能问题了。解决办法只能是服务器端分页。不难。我们不用几分钟就能搞定。

服务端分页函数(WCF/WCF Ria Service)

首先,服务器端写两个函数,一个是计算总的页数,另一个是取得当前页的数据。举例来说,我服务器端用的是WCF Ria Service(只是例子,没有具体意义的):

1 // 取得当前页的数据
2   public IQueryable < MyEntity > GetMyEntities( int PageSize, int CurrentPage)
3 {
4 if (CurrentPage <= 1 )
5 return this .ObjectContext.MyEntity.Where(s => s.EntityID > 1 ).OrderByDescending(e => e.EntityChangedAt).Take(PageSize);
6 else
7 return this .ObjectContext.MyEntity.Where(s => s.EntityID > 1 ).OrderByDescending(e => e.EntityChangedAt).Skip(PageSize * (CurrentPage - 1 )).Take(PageSize);
8 }
9
10   // 计算总页数
11   [Invoke]
12 public int GetEntityTotalPages( int PageSize)
13 {
14 return Int32.Parse(Math.Ceiling(Convert.ToDouble( this .ObjectContext.MyEntity.Where(s => s.EntityID > 1 ).Count()) / Convert.ToDouble(PageSize)).ToString());
15 }
Silverlight调用/in *.Xaml.cs(下一篇讲MVVM的方式)

接下来,就是在*.xaml.cs中获取服务器端数据了,代码都带注释了,应该很好懂:

1 public partial class MainPage : UserControl
2 {
3 private const int PageSize = 10 ;
4 private List < int > itemCount = new List < int > ();
5 private MyDomainContext d = new MyDomainContext(); // Ria Service Context
6
7 public MainPage()
8 {
9 InitializeComponent();
10
11 // 点击页码的事件,获取当前页的数据并绑定到DataGrid
12 this .dataPager1.PageIndexChanged += (s, e) =>
13 {
14 this .Cursor = Cursors.Wait;
15
16 d.Load < MyEntity > (d.GetMyEntitiesQuery(PageSize, ((DataPager)s).PageIndex + 1 ), lo =>
17 {
18 if ( ! lo.HasError)
19 {
20 PagedCollectionView pcv = new PagedCollectionView(lo.Entities);
21 this .dataGrid1.ItemsSource = pcv;
22 this .Cursor = Cursors.Arrow;
23 }
24 }, null );
25 };
26 }
27
28 // 按钮点击加载数据
29 private void button1_Click( object sender, RoutedEventArgs e)
30 {
31 this .Cursor = Cursors.Wait;
32
33 // 获得总的页码数,绑定到DataPager
34 d.GetEntityTotalPages(PageSize, s =>
35 {
36 if ( ! s.HasError)
37 {
38 int totalpagers = s.Value;
39
40 for ( int i = 1 ; i <= totalpagers; i ++ )
41 itemCount.Add(i);
42
43 PagedCollectionView pcv = new PagedCollectionView(itemCount);
44 pcv.PageSize = 1 ;
45 this .dataPager1.Source = pcv; // 这儿会自动触发this.dataPager1.PageIndexChanged事件
46 }
47 }, null );
48
49 }
50
51 }

前台Xaml代码就是拖一个DataGrid,拖一个DataPager,灰常简单,不写了。

Fiddler查看下载的真正数据

再次用Fiddler分析了一下客户端和服务端的数据,发现这个DataPager是“服务端分页”了。每次只返回一页数据。

Fiddler

不用源码了吧,都贴在文章里了。(下一篇我们把上面的前台代码用MVVM模式整理一下,清爽一点!)

Domain DataSource控件

如果你用的是Toolkit的DomainDataSource控件来处理paging, sorting, filtering ... 那就忽略本文,因为它每次是take=100,只取本页数据的,但这个控件不是MVVM模式,注意一下)

更强悍的服务器端分页/排序/过滤/搜索 - MVVM友好

看这一篇文章《EntityList<T>/DomainCollectionView<T>/DomainCollectionViewLoader<T>》 

九头鸭.net分页控件DataPage的主要功能: 1、支持通过Url进行分页DataPage除提供默认的类似于DataGrid和GridView的PostBack分页方式外,还支持通过Url进行分页,象大多数asp程序中分页一样, Url分页方式允许用户通过在浏览器地址栏中输入相应的地址即可直接进入指定页面,也可以使搜索引擎搜索到所有分页的页面的内容,因此具有用户友好和搜索引擎友好的优点,关于Url分页与PostBack分页方式的差异,请参考Url与PostBack分页方式的对比。 2、支持Url分页方式下的Url重写(UrlRewrite)功能 Url重写技术可以使显示给用户的Url不同于实际的Url,Url重写技术被广泛应用于搜索引擎优化(SEO)、网站重组后重定向页面路径以及提供用户友好的Url等方面, DataPage支持Url重写技术使您可以自定义分页导航的Url格式,实现Url重写; 3、支持使用用户自定义图片做为导航元素: 您可以使用自定义的图片文件做为分页控件的导航元素,而不仅仅限于显示文字内容。 4、功能强大灵活、使用方便、可定制性强: DataPage分页控件的所有导航元素都可以由用户进行单独控制,支持使用26种分页皮肤样式 5、增强的 Visual Studio 2005/2008设计时支持 增强的设计时支持使控件在设计时更加直观,易于使用,开发快捷方便。 6、兼容IE6.0 及FireFox 1.5 等浏览器 7、丰富而完整的控件文档和示例项目: 控件附带的完整的帮助文档及示例项目能够帮助您快速上手,熟悉DataPage控件的使用,您还可以通过给作者留言以及论坛提问等方式解决控件使用中遇到的问题。 8、DataPage分页效率高效除了默认实例access外如果选择sqlserver存储过程分页将会更高效
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值