郑州网站关键,网页浏览器主要通过ftp协议,网站开发经验教训,品牌设计培训silverlight并没有提供现成的分页控件#xff0c;百度了一圈#xff0c;也没有发现aspx中好用的类似AspNetPager成熟控件#xff0c;网上现有的一些分页代码#xff0c;很多也是基于1.0版本的#xff0c;silverlight2.0的并不多#xff0c;自个儿琢磨了一下#xff0c;发…silverlight并没有提供现成的分页控件百度了一圈也没有发现aspx中好用的类似AspNetPager成熟控件网上现有的一些分页代码很多也是基于1.0版本的silverlight2.0的并不多自个儿琢磨了一下发现自己弄一个也并非难事思路和主要代码分享如下: 1.通用的“海量”数据分页存储过程在做aspx开发时我已经用存储过程分页多年这个东东是通用的(不管前端用什么语言来做)而且性能也不错所以这里就直接套过来用了百度一下分页存储过程会有N多版本这里也给出我自己写的一个版本(仅适用于sqlserver 2005及以上版本) 分页存储过程-- -- Author: 杨俊明-菩提树下的杨过-- Create date: 2006-11-05-- Description: 高效分页存储过程仅适用于Sql2005-- Notes: 排序字段强烈建议建索引-- CREATE Procedure [dbo].[up_Page2005] TableName varchar(500), --表名 Fields nvarchar(MAX) *, --字段名(全部字段为*) OrderField nvarchar(MAX), --排序字段(必须!支持多字段) sqlWhere nvarchar(MAX) Null,--条件语句(不用加where) pageSize int, --每页多少条记录 pageIndex int 1 , --指定当前为第几页 TotalPage int output --返回总页数 asbegin Begin Tran --开始事务 Declare sql nvarchar(MAX); Declare totalRecord int; --计算总记录数 if (SqlWhere or sqlWhereNULL) set sql select totalRecord count(*) from TableName else set sql select totalRecord count(*) from TableName where sqlWhere EXEC sp_executesql sql,NtotalRecord int OUTPUT,totalRecord OUTPUT--计算总记录数 --计算总页数 select TotalPageCEILING((totalRecord0.0)/PageSize) if (SqlWhere or sqlWhereNULL) set sql Select * FROM (select ROW_NUMBER() Over(order by OrderField ) as RowId, Fields from TableName with (nolock) else set sql Select * FROM (select ROW_NUMBER() Over(order by OrderField ) as RowId, Fields from TableName with (nolock) where SqlWhere --处理页数超出范围情况 if PageIndex0 Set pageIndex 1 if pageIndexTotalPage Set pageIndex TotalPage --处理开始点和结束点 Declare StartRecord int Declare EndRecord int set StartRecord (pageIndex-1)*PageSize 1 set EndRecord StartRecord pageSize - 1 --继续合成sql语句 set Sql Sql ) as TableName where RowId between Convert(varchar(50),StartRecord) and Convert(varchar(50),EndRecord) print sql ; Exec(Sql) --------------------------------------------------- If Error 0 Begin RollBack Tran Return -1 End Else Begin Commit Tran Return totalRecord ---返回记录总数 Endend Code-- -- Author: 杨俊明-菩提树下的杨过-- Create date: 2006-11-05-- Description: 高效分页存储过程仅返回总页数和总记录数仅适用于Sql2005-- Notes: 排序字段强烈建议建索引-- CREATE Procedure [dbo].[up_Page2005_Statistic] TableName varchar(500), --表名 Fields nvarchar(MAX) *, --字段名(全部字段为*) OrderField nvarchar(MAX), --排序字段(必须!支持多字段) sqlWhere nvarchar(MAX) Null,--条件语句(不用加where) pageSize int, --每页多少条记录 pageIndex int 1 , --指定当前为第几页 TotalPage int output --返回总页数 asbegin Declare sql nvarchar(MAX); Declare totalRecord int; --计算总记录数 if (SqlWhere or sqlWhereNULL) set sql select totalRecord count(*) from TableName else set sql select totalRecord count(*) from TableName where sqlWhere EXEC sp_executesql sql,NtotalRecord int OUTPUT,totalRecord OUTPUT--计算总记录数 --计算总页数 select TotalPageCEILING((totalRecord0.0)/PageSize) print TotalRecord Convert(nvarchar(50),totalRecord); print TotalPage Convert(nvarchar(50),totalPage); Return totalRecord ---返回记录总数end 注:第二个是直接在第一个基础上简化得来的仅返回总页数和总记录数方便某些不需要返回实体数据仅需要知道总页数和总记录数的特殊情况调用 2.利用wcf直接或间接调用存储过程返回json数据 wcf能返回json数据已经不是什么新鲜事儿了这里就不多说了贴出主要代码(直接拿我以前封装好的工具库中的一个方法示例一下大家知道意思就可以了) Code/// summary /// 调用分页存储过程返回Json数据 /// /summary /// param namepTable/param /// param namepWhere/param /// param namepFields/param /// param namepOrder/param /// param namepPageSize/param /// param namepPageIndex/param /// param namepTotalPage/param /// param namepTotalRecord/param /// returns/returns [WebInvoke(Method *, ResponseFormat WebMessageFormat.Json, UriTemplate SelectPageData?pTable{pTable}pWhere{pWhere}pFields{pFields}pOrder{pOrder}pPageSize{pPageSize}pPageIndex{pPageIndex}pTotalPage{pTotalPage}pTotalRecord{pTotalRecord})] [OperationContract] public Stream SelectPageData(string pTable, string pWhere, string pFields, string pOrder, int pPageSize,int pPageIndex,int pTotalPage,int pTotalRecord) { return GetStream(GetJsonData(Database.GetDataTableForPage(pTable,pFields,pOrder,pWhere,pPageSize,pPageIndex,pTotalPage,pTotalRecord))); } /// summary /// 调用分页存储过程返回总页数和总记录数 /// /summary /// param namepTable/param /// param namepWhere/param /// param namepFields/param /// param namepOrder/param /// param namepPageSize/param /// param namepPageIndex/param /// param namepTotalPage/param /// param namepTotalRecord/param /// returns/returns [WebInvoke(Method *, ResponseFormat WebMessageFormat.Json, UriTemplate SelectPageDataStatistic?pTable{pTable}pWhere{pWhere}pFields{pFields}pOrder{pOrder}pPageSize{pPageSize}pPageIndex{pPageIndex}pTotalPage{pTotalPage}pTotalRecord{pTotalRecord})] [OperationContract] public Stream SelectPageDataStatistic(string pTable, string pWhere, string pFields, string pOrder, int pPageSize, int pPageIndex, int pTotalPage, int pTotalRecord) { Database.GetTotalPageAndTotalRecordForPage(pTable, pFields, pOrder, pWhere, pPageSize, pPageIndex, out pTotalPage,out pTotalRecord); string _Result {TotalPage: pTotalPage.ToString() ,RecordCount: pTotalRecord }; return GetStream(_Result); } 其中有二个方法GetStream和GetJsonData主要用于将字符串转换为流以及将格式化Json字符串 Codeprivate Stream GetStream(string str) { MemoryStream ms new MemoryStream(); StreamWriter sw new StreamWriter(ms); sw.AutoFlush true; sw.Write(str); ms.Position 0; WebOperationContext.Current.OutgoingResponse.ContentType text/plain; return ms; } public static string GetJsonData(DataTable dt) { string _Result Utils.CreateJsonParameters(dt);//CreateJsonParameters是我工具库里的一个方法用于将DataTable转化为json字符串 if (_Result.IsNullStr()) { _Result [{}]; } else { if (_Result.StartsWith({ \Head\:[)) { _Result _Result.Replace({ \Head\:[, [); } if (_Result.EndsWith(]})) { _Result _Result.Trim(}); } } return _Result; } 3.前面二步弄完了基本上就可以动手写silverlight代码了 xaml前端文件: CodeUserControl xmlns:basicsclr-namespace:System.Windows.Controls;assemblySystem.Windows.Controls xmlns:dataclr-namespace:System.Windows.Controls;assemblySystem.Windows.Controls.Data x:ClassWcfTest.DataGrid xmlnshttp://schemas.microsoft.com/winfx/2006/xaml/presentation xmlns:xhttp://schemas.microsoft.com/winfx/2006/xaml Grid x:NameLayoutRoot BackgroundWhite ShowGridLinesFalse Grid.RowDefinitions RowDefinition /RowDefinition RowDefinition Height25 /RowDefinition /Grid.RowDefinitions Grid.ColumnDefinitions ColumnDefinition /ColumnDefinition ColumnDefinition /ColumnDefinition /Grid.ColumnDefinitions data:DataGrid x:Namedg AutoGenerateColumnsFalse Grid.Column0 Grid.Row0 Grid.ColumnSpan2 data:DataGrid.Columns data:DataGridTextColumn HeaderF_ID Binding{Binding F_ID} / data:DataGridTextColumn HeaderF_ClassName Binding{Binding F_ClassName} / data:DataGridTextColumn HeaderF_RootId Binding{Binding F_RootId} / data:DataGridTextColumn HeaderF_Depth Binding{Binding F_Depth} / data:DataGridTextColumn HeaderF_Type Binding{Binding F_Type} / /data:DataGrid.Columns /data:DataGrid TextBlock x:NametxtStat Text共有X条记录第X页/共X页X/每页 Grid.Row1 Grid.Column0 VerticalAlignmentCenter Margin5,0,0,0 /TextBlock StackPanel Grid.Column1 Grid.Row1 HorizontalAlignmentRight OrientationHorizontal VerticalAlignmentCenter Height22 Button x:NamebtnFirst Content首页 ClickbtnFirst_Click /Button Button x:NamebtnPrev Content上页 Margin5,0,0,0 ClickbtnPrev_Click/Button Button x:NamebtnNext Content下页 Margin5,0,0,0 ClickbtnNext_Click/Button Button x:NamebtnLast Content末页 Margin5,0,0,0 ClickbtnLast_Click /Button TextBox x:NametxtPageIndex Text1 Margin5,0,0,0 Width30 KeyUptxtPageIndex_KeyUp/TextBox Button x:NamebtnPageGo ContentGo Margin5,0,5,0 ClickbtnPageGo_Click/Button /StackPanel /Grid/UserControl 讲解一下:用Grid布局先分上下二行第一行放一个DataGrid控件(silverlight2新增的控件!),第二行分二列左列显示统计信息右列显示翻页按钮 后端cs代码: Codeusing System;using System.Collections.Generic;using System.Json;using System.Net;using System.Windows.Controls;using System.Windows.Media;using JIMMY.TOOLS.Silverlight;namespace WcfTest{ public partial class DataGrid : UserControl { protected string pTable , pWhere , pFields , pOrderField , pBaseUri http://localhost:7055/Demo.svc/; protected int pPageSize 10, pPageIndex 1, pTotalPage 0, pTotalRecord 0; public DataGrid() { InitializeComponent(); #region 初始化查询参数 pTable T_Class; //pWhere F_Typeplace And F_Depth0; pWhere ; pFields F_ID,F_ClassName,F_Depth,F_RootId,F_Type; pOrderField F_RootId; #endregion //开始查询 LoadData(); LoadDataStatistic(); } /// summary /// 加载分页数据 /// /summary void LoadData() { Uri serviceUri new Uri(pBaseUri SelectPageData?pTable pTable.UrlEncode() pWhere pWhere.UrlEncode() pFields pFields.UrlEncode() pOrder pOrderField.UrlEncode() pPageSize pPageSize.ToString().UrlEncode() pPageIndex pPageIndex.ToString().UrlEncode() pTotalPage pTotalPage.ToString().UrlEncode() pTotalRecord pTotalRecord.ToString().UrlEncode()); WebClient downloader new WebClient(); downloader.OpenReadCompleted new OpenReadCompletedEventHandler(LoadDataCompleted); downloader.OpenReadAsync(serviceUri); txtStat.Text 数据加载中; txtStat.Foreground new SolidColorBrush(Color.FromArgb(255, 255, 0, 0)); } /// summary /// 加载分页数据的回调函数 /// /summary /// param namesender/param /// param namee/param void LoadDataCompleted(object sender, OpenReadCompletedEventArgs e) { if (e.Error null) { try { JsonArray _Arr (JsonArray)JsonArray.Load(e.Result); ListData _List new ListData(); for (int i 0; i _Arr.Count; i) { _List.Add(new Data() { F_ClassName _Arr[i][F_ClassName], F_Depth int.Parse(_Arr[i][F_Depth]), F_ID new Guid(_Arr[i][F_ID]), F_RootId int.Parse(_Arr[i][F_RootId]), F_Type _Arr[i][F_Type] }); } dg.ItemsSource _List; } catch (Exception ex) { } } else { } } /// summary /// 加载数据的总页数/总记录条数 /// /summary void LoadDataStatistic() { Uri serviceUri new Uri(pBaseUri SelectPageDataStatistic?pTable pTable.UrlEncode() pWhere pWhere.UrlEncode() pFields pFields.UrlEncode() pOrder pOrderField.UrlEncode() pPageSize pPageSize.ToString().UrlEncode() pPageIndex pPageIndex.ToString().UrlEncode() pTotalPage pTotalPage.ToString().UrlEncode() pTotalRecord pTotalRecord.ToString().UrlEncode()); WebClient downloader new WebClient(); downloader.OpenReadCompleted new OpenReadCompletedEventHandler(LoadDataStatisticCompleted); downloader.OpenReadAsync(serviceUri); } /// summary /// 加载数据的总页数/总记录条数--回调函数 /// /summary /// param namesender/param /// param namee/param void LoadDataStatisticCompleted(object sender, OpenReadCompletedEventArgs e) { if (e.Error null) { try { JsonValue _json JsonObject.Load(e.Result); pTotalPage int.Parse(_json[TotalPage]); pTotalRecord int.Parse(_json[RecordCount]); txtStat.Text 共有 pTotalRecord 条记录第 pPageIndex.ToString() 页/共 pTotalPage 页 pPageSize.ToString() /每页; txtPageIndex.Text pPageIndex.ToString(); txtStat.Foreground new SolidColorBrush(Color.FromArgb(255, 0, 0, 0)); } catch (Exception ex) { } } else { } } /// summary /// 上页 /// /summary /// param namesender/param /// param namee/param private void btnPrev_Click(object sender, System.Windows.RoutedEventArgs e) { pPageIndex pPageIndex 1 ? 1 : pPageIndex - 1; LoadData(); LoadDataStatistic(); } /// summary /// 下页 /// /summary /// param namesender/param /// param namee/param private void btnNext_Click(object sender, System.Windows.RoutedEventArgs e) { pPageIndex pPageIndex pTotalPage ? pTotalPage : pPageIndex 1; LoadData(); LoadDataStatistic(); } /// summary /// 首页 /// /summary /// param namesender/param /// param namee/param private void btnFirst_Click(object sender, System.Windows.RoutedEventArgs e) { pPageIndex 1; LoadData(); LoadDataStatistic(); } /// summary /// 末页 /// /summary /// param namesender/param /// param namee/param private void btnLast_Click(object sender, System.Windows.RoutedEventArgs e) { pPageIndex pTotalPage; LoadData(); LoadDataStatistic(); } /// summary /// 跳转到指定页 /// /summary /// param namesender/param /// param namee/param private void btnPageGo_Click(object sender, System.Windows.RoutedEventArgs e) { LoadPageIndexData(); } private void LoadPageIndexData() { int _currentPageIndex 1; if (!int.TryParse(txtPageIndex.Text, out _currentPageIndex)) { txtPageIndex.Text _currentPageIndex.ToString(); } if (_currentPageIndex pTotalPage) { _currentPageIndex pTotalPage; txtPageIndex.Text _currentPageIndex.ToString(); } if (_currentPageIndex 1) { _currentPageIndex 1; txtPageIndex.Text _currentPageIndex.ToString(); } pPageIndex _currentPageIndex; LoadData(); LoadDataStatistic(); } /// summary /// 输入页数回车后查询指定页数据 /// /summary /// param namesender/param /// param namee/param private void txtPageIndex_KeyUp(object sender, System.Windows.Input.KeyEventArgs e) { if (e.Key System.Windows.Input.Key.Enter) { LoadPageIndexData(); } } } /// summary /// 返回数据的类 /// /summary public class Data { public Guid F_ID { get; set; } public string F_ClassName { get; set; } public int F_RootId { get; set; } public int F_Depth { get; set; } public string F_Type { get; set; } } } 主要思路:定义一组变量变于保存查询参数(包括当前第几页每页多少条记录之类)然后利用WebClient访问wcf将json数据download回来成功后解析为json对象再转化为强类型的ListData最后绑定完事 运行效果图: 转载于:https://www.cnblogs.com/yjmyzz/archive/2009/03/02/1401622.html