DataPager实现服务器端分页

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

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

 public static class DataPageExtension
    {
        public static void BindSource(this DataPager dataPager, int totalCount, int pageSize)
        {
            List list = new List(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 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(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(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(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的数据绑定方法。这样的分页方法不知大家有何评价,欢迎拍砖。
/本篇文章来源于Java秀,原文出处:http://www.java.sh/article/sliverlight/1237_2.html


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
九头鸭.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、付费专栏及课程。

余额充值