微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐