代码改变世界

Silverlight 服务器端分页的自定义实现

2011-02-20 11:52  Zhang_Chen  阅读(1510)  评论(2编辑  收藏  举报

目前较多的分页的实现,一种是客户端的分页如

   1:   PagedCollectionView itemListView = new PagedCollectionView(itemList);
   2:  // Set the DataPager and ListBox to the same data source.
   3:  dataPager1.Source = itemListView;
   4:  dataGrid1.ItemsSource = itemListView;

但是我们都知道在数据量较大的时候,这种方式是不可用的。

另一种是使用DomainDataSource,但这对于非使用EF4的项目,或服务端不是.Net的系统显然也不是好的办法。

现分享一下我的实现方式。

JSON数据+IPagedCollectionView实现

image

image

关键步骤:

1、PagedServerCollection

类实现如下接口

IPagedCollectionView, INotifyPropertyChanged, INotifyCollectionChanged, IEnumerable

其中IPagedCollectionView提供分页实现,INotifyPropertyChanged提供当前页、总页数等的变更通知,INotifyCollectionChanged提供内容变更通知,在结果变化时,让DataGrid等实现刷新。IEnumerable就不必说了。

2、DataLoader

与服务器端通信,提交参数,获取结果。用WebClient实现

3、PagedResult

一个简单的分页结果容器,显示总数、页码和当前页结果

4、Newtonsoft.Json

Json.Net开源项目,支持各个平台。实现序列化和反序列化。感觉比.Net自带的好用

http://json.codeplex.com/

使用示例:

XAML:

<Grid x:Name="LayoutRoot" Background="White">
        <sdk:DataGrid AutoGenerateColumns="True" Margin="9,10,11,42" Name="dataGrid1" />
        <sdk:DataPager Height="28" Margin="10,0,12,8" Name="dataPager1" PageSize="10" VerticalAlignment="Bottom" />
    </Grid>
 

Code:

var data=new Utils.PagedServerCollection<Models.User>("/Demo.aspx");
    dataGrid1.ItemsSource = data;
    dataPager1.Source = data;
    data.ToPage(0);
 
 

Models.User

[DataContract]
    public class User
    {
        [DataMember]
        public string Name { get; set; }
        [DataMember]
        public int Age { get; set; }
        [DataMember]
        public string Username { get; set; }
        [DataMember]
        public long Role { get; set; }
    }

Demo.aspx

        var pageindex=0;
            var pagesize = 20;
                
            int.TryParse( Request["pageindex"],out pageindex);
            int.TryParse(Request["pagesize"], out pagesize);
            pageindex = Math.Max(0, pageindex);
            pagesize = Math.Max(1, pagesize);
            //
            var result = new PagedResult<User>
            {
                Count = 5000,
                PageIndex = pageindex
            };
            var items=new List<User>();
            for (int i = 0; i < pagesize; i++)
            {
                items.Add(new User
                {
                    Name = "User" + (pagesize * pageindex + i).ToString(),
                    Age = 20,
                    Role = 0x000100,
                    Username = "Username" + (pagesize * pageindex + i).ToString()
                });
            }
            result.Items = items;

            Response.Write(JsonConvert.SerializeObject(result));
            Response.End();

效果:

imageimage

当然这只是一个例子。如何更好的使用,还需要您做相应的修改

源码:这里