您的位置:首页 > 其它

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

2011-02-20 11:52 197 查看
目前较多的分页的实现,一种是客户端的分页如

PagedCollectionViewitemListView=newPagedCollectionView(itemList);

[code]//SettheDataPagerandListBoxtothesamedatasource.
dataPager1.Source=itemListView;

dataGrid1.ItemsSource=itemListView;

[/code]

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

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

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

JSON数据+IPagedCollectionView实现









关键步骤:

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:

<Gridx:Name="LayoutRoot"Background="White">
<sdk:DataGridAutoGenerateColumns="True"Margin="9,10,11,42"Name="dataGrid1"/>
<sdk:DataPagerHeight="28"Margin="10,0,12,8"Name="dataPager1"PageSize="10"VerticalAlignment="Bottom"/>
</Grid>


Code:

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



Models.User

[DataContract]
publicclassUser
{
[DataMember]
publicstringName{get;set;}
[DataMember]
publicintAge{get;set;}
[DataMember]
publicstringUsername{get;set;}
[DataMember]
publiclongRole{get;set;}
}


Demo.aspx

varpageindex=0;
varpagesize=20;

int.TryParse(Request["pageindex"],outpageindex);
int.TryParse(Request["pagesize"],outpagesize);
pageindex=Math.Max(0,pageindex);
pagesize=Math.Max(1,pagesize);
//
varresult=newPagedResult<User>
{
Count=5000,
PageIndex=pageindex
};
varitems=newList<User>();
for(inti=0;i<pagesize;i++)
{
items.Add(newUser
{
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();


效果:







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

源码:这里
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: