日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2025/4/16 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Silverlight3中的DataPager实现服务器端分页 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

代振軍同學的blog中描述了使用DataPager實現(xiàn)客戶端分頁:
http://www.cnblogs.com/daizhj/archive/2009/08/07/1529331.html
一般說來,在項目中一般很少使用這種客戶端的分頁方式,除非數(shù)據(jù)量很少(干脆不分頁算了)。
把大量的數(shù)據(jù)一次性傳輸?shù)娇蛻舳丝刹皇莻€明智的做法,我們一般都是從客戶端傳入查找條件參數(shù)(包括過濾條件和分頁條件參數(shù)),然后服務端從數(shù)據(jù)庫中找出符合查找條件的的記錄列表傳輸給客戶端,客戶端綁定到DataGrid控件上。
這里使用“開啟了Silverlight的WCF服務”來和客戶端(silverlight)程序進行通信,數(shù)據(jù)訪問采用Ado.net Entity Framework,解決方案結構如圖:

建立了一個測試用的數(shù)據(jù)庫:包含兩張表:

該實例除了演示了使用DataPager的服務器端分頁外還實現(xiàn)了使用Entity SQL的動態(tài)查找功能:

分頁控件很多人都寫過,但不像DataPager那樣要傳入個PagedCollectionView才行,一般傳入總記錄數(shù)和分頁大小就可以了,所以,我們給Datapager增加一個擴展方法來綁定總記錄數(shù)和分頁大小:

Code
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服務端的分頁方法如下:

Code
?[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();
????????????}
????????}

上面的代碼實現(xiàn)了使用Entity SQl的動態(tài)查找功能和分頁功能,可以看到:只有當pageindex 等于0的時候才計算總記錄數(shù),提高了方法執(zhí)行的效率;方法的輸入?yún)?shù)和輸出參數(shù)都進行了實體類的封裝,建議在實際項目中也這樣做,特別是在使用依賴注入的時候。
在客戶端(Silverlight項目)中引用好服務后,頁面的cs代碼如下:

Code
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的時候調(diào)用BindSource擴展方法來綁定總記錄數(shù)和頁大小;里面還有個關于Combobox的數(shù)據(jù)綁定方法。這樣的分頁方法不知大家有何評價,歡迎拍磚。

?2009-08-18 更新:修改了數(shù)據(jù)庫的Departments表結構,實現(xiàn)了在Combobox里顯示TreeView的效果(如效果圖)。

總結

以上是生活随笔為你收集整理的使用Silverlight3中的DataPager实现服务器端分页的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。