分页控件很多人都写过,但不像DataPager那样要传入个PagedCollectionView才行,一般传入总记录数和分页大小就可以了,所以,我们给Datapager增加一个扩展方法来绑定总记录数和分页大小:
public static class DataPageExtension
{
public static void Bindsource(this DataPager dataPager, int @R_689_10586@lCount, int pageSizE)
{
List list = new List(@R_689_10586@lCount);
for (int i = 0; i < @R_689_10586@lCount; i++) list.Add(i);
PagedCollectionView pcv = new PagedCollectionView(list);
pcv.PageSize = pageSize;
dataPager.source = pcv;
}
}
WCF服务端的分页方法如下:
[OperationContract]
public List GetemployeeList(employeeFilter filter,out int @R_689_10586@lCount)
{
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();
@R_689_10586@lCount = 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.@R_689_10586@lCount, 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