使用Silverlight3中的DataPager实现服务器端分页

使用Silverlight3中的DataPager实现服务器端分页

代振军同学的blog中描述了使用DataPager实现客户端分页:
http://www.cnblogs.com/daizhj/archive/2009/08/07/1529331.html
一般说来,在项目中一般很少使用这种客户端的分页方式,除非数据量很少(干脆不分页算了)。
把大量的数据一次性传输到客户端可不是个明智的做法,我们一般都是从客户端传入查找条件参数(包括过滤条件和分页条件参数),然后服务端从数据库中找出符合查找条件的的记录列表传输给客户端,客户端绑定到DataGrid控件上。
这里使用“开启了Silverlight的WCF服务”来和客户端(silverlight)程序进行通信,数据访问采用Ado.net Entity Framework,解决方案结构如图:

建立了一个测试用的数据库:包含两张表:

该实例除了演示了使用DataPager的服务器端分页外还实现了使用Entity SQL的动态查找功能:

分页控件很多人都写过,但不像DataPager那样要传入个PagedCollectionView才行,一般传入总记录数和分页大小就可以了,所以,我们给Datapager增加一个扩展方法来绑定总记录数和分页大小:


public static class DataPageExtension
     {
        
public static void BindSource( this DataPager dataPager, int totalCount, int pageSize)
         {
             List
< int > list = new List < int > (totalCount);
            
for ( int i = 0 ; i < totalCount; i ++ ) list.Add(i);
             PagedCollectionView pcv
= new PagedCollectionView(list);
             pcv.PageSize
= pageSize;
             dataPager.Source
= pcv;
         }
     }

WCF服务端的分页方法如下:


[OperationContract]
        
public List < MyEmployee > GetEmployeeList(EmployeeFilter filter, out int totalCount)
         {
            
using (TestDBEntities db = new TestDBEntities())
             {
                
int rowsCount = 0 ;
                 StringBuilder sbSql
= new StringBuilder( " True " );
                
if (filter.DeptID != new Guid())
                     sbSql.Append(
string .Format( " and it.Departments.DepartmentID = Guid'{0}' " , filter.DeptID));
                 sbSql.Append(
string .Format( " and it.EmpolyeeName like '%{0}%' " , filter.EmpName));

                 var query
= from emp in db.Employees.Where(sbSql.ToString())
                             select
new MyEmployee
                             {
                                 ID
= emp.EmployeeID,
                                 Name
= emp.EmpolyeeName,
                                 Sex
= emp.EmployeeSex ? " " : " " ,
                                 Age
= emp.EmployeeAge,
                                 Address
= emp.EmployeeAddress,
                                 DeptName
= emp.Departments.DepartmentName
                             };
                
if (filter.PageIndex <= 0 )
                     rowsCount
= query.Count();
                 totalCount
= rowsCount;
                 query
= query.OrderBy(t => t.Name).Skip(filter.PageIndex * filter.PageSize).Take(filter.PageSize);
                
return query.ToList();
             }
         }

上面的代码实现了使用Entity SQl的动态查找功能和分页功能,可以看到:只有当pageindex 等于0的时候才计算总记录数,提高了方法执行的效率;方法的输入参数和输出参数都进行了实体类的封装,建议在实际项目中也这样做,特别是在使用依赖注入的时候。
在客户端(Silverlight项目)中引用好服务后,页面的cs代码如下:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Data;
using DataPagerTest.EmployeeServiceReference;

namespace DataPagerTest
{
    
public partial class MainPage : UserControl
     {
         EmployeeServiceClient client
= new EmployeeServiceClient();
         EmployeeFilter filter
= new EmployeeFilter();
        
public MainPage()
         {
             InitializeComponent();
         }
        
private void UserControl_Loaded( object sender, RoutedEventArgs e)
         {
             dpEmployee.PageIndexChanged
+= new EventHandler < EventArgs > (dpEmployee_PageIndexChanged);
             cbDept.SelectionChanged
+= new SelectionChangedEventHandler(cbDept_SelectionChanged);
             BindCombox();
         }

        
void cbDept_SelectionChanged( object sender, SelectionChangedEventArgs e)
         {
             BindGrid(
0 );
         }
        
void dpEmployee_PageIndexChanged( object sender, EventArgs e)
         {
             BindGrid(dpEmployee.PageIndex);
         }
        
private void btnQuery_Click( object sender, RoutedEventArgs e)
         {
             BindGrid(
0 );
         }
        
private void BindGrid( int pageIndex)
         {
             Departments dept
= cbDept.SelectedItem as Departments;
             filter.DeptID
= dept.DepartmentID;
             filter.EmpName
= tbEmpName.Text.Trim();
             filter.PageIndex
= pageIndex;
             filter.PageSize
= 9 ;
             client.GetEmployeeListCompleted
+= new EventHandler < GetEmployeeListCompletedEventArgs > (client_GetEmployeeListCompleted);
             client.GetEmployeeListAsync(filter);
         }
        
void client_GetEmployeeListCompleted( object sender, GetEmployeeListCompletedEventArgs e)
         {
             dgEmployee.ItemsSource
= e.Result;
            
if (filter.PageIndex <= 0 )
                 dpEmployee.BindSource(e.totalCount, filter.PageSize);
         }
        
void BindCombox()
         {
             client.GetDepartmentListCompleted
+= new EventHandler < GetDepartmentListCompletedEventArgs > (client_GetDepartmentListCompleted);
             client.GetDepartmentListAsync();
         }

        
void client_GetDepartmentListCompleted( object sender, GetDepartmentListCompletedEventArgs e)
         {
             cbDept.ItemsSource
= e.Result;
             cbDept.DisplayMemberPath
= " DepartmentName " ;
             cbDept.SelectedIndex
= 0 ;
             BindGrid(
0 );
         }

        
        
     }
}

在PageIndex等于0的时候调用BindSource扩展方法来绑定总记录数和页大小;里面还有个关于Combobox的数据绑定方法。这样的分页方法不知大家有何评价,欢迎拍砖。

阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
WPF DataPager是一个在WPF使用的数据分页控件,它可以帮助我们在大数据集实现分页功能。它通常与数据源(例如数据库或集合)和绑定控件(例如DataGrid或ListView)一起使用。 WPF DataPager提供了以下主要功能: 1. 分页功能:它允许我们根据指定的PageSize(每页显示的条数)和TotalItemCount(总条目数)将数据分页显示。通过设置相应的属性,我们可以灵活地控制分页数目和当前页码。 2. 页面导航:它提供了一组用于导航的按钮,包括首页、上一页、下一页和末页按钮,使用户可以通过点击这些按钮切换到不同的页面。我们还可以自定义这些按钮的样式和行为。 3. 数据源同步:当用户切换页面时,DataPager会自动更新数据源,以显示相应页面的数据。它可以与各种数据源一起使用,并且可以与多个控件进行数据绑定。 4. 可视化样式:DataPager提供了一些可自定义的样式和模板,使我们可以按照自己的需求来设计和美化分页控件的外观。 5. 事件处理:DataPager还提供了一些事件,例如PageChanging事件,当用户试图切换页面时触发,我们可以处理此事件来执行自定义操作,例如在切换页面之前执行一些验证或数据处理逻辑。 总的来说,WPF DataPager是一个功能强大且易于使用的控件,它为我们提供了方便的数据分页功能,可以帮助我们更好地管理和展示大量数据,提高用户体验。无论是在企业级应用程序还是个人项目,都可以通过使用DataPager实现数据分页的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangq723

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值