扩展GridView控件(十)——再增加一种分页样式_[Asp.Net教程]
					GridView既强大又好用。为了让它更强大、更好用,我们来写一个继承自GridView的控件。 
[源码下载] 
http://files.cnblogs.com/webabcd/yycontrols.rar 
介绍 
用着GridView自带的分页样式总觉得不太习惯,我们可以在PagerTemplate中来写一些自定义的样式,但是也挺麻烦的,其实我们可以扩展一下GridView,给它再增加一种分页样式 
控件开发 
1、新建一个继承自GridView的类。 
复制C#代码保存代码/// 
/// 继承自GridView
/// 
[ToolboxData(@"<{0}:SmartGridView runat='server'>{0}:SmartGridView>")]
public class SmartGridView : GridView
{
}
2、新建一个Paging类,定义一个分页样式的枚举 
复制C#代码保存代码using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
namespace YYControls.SmartGridView
{
 /// 
 /// 自定义分页相关
 /// 
 public class Paging
 {
 /// 
 /// 自定义分页样式
 /// 
 public enum PagingStyleCollection
 {
 /// 
 /// 不用自定义分页样式
 /// 
 None,
 /// 
 /// 默认自定义分页样式
 /// 
 Default
 }
 }
}
3、在继承自GridView的类中加一个上面定义的枚举属性 
复制C#代码保存代码private Paging.PagingStyleCollection _pagingStyle;
/// 
/// 自定义分页样式
/// 
[Description("自定义分页样式"), DefaultValue(""), Category("扩展")]
public Paging.PagingStyleCollection PagingStyle
{
 get { return _pagingStyle; }
 set { _pagingStyle = value; }
}
4、如果GridView使用的是数据源控件的话,计算总记录数 
复制C#代码保存代码/// 
/// OnLoad
/// 
/// 
protected override void OnLoad(EventArgs e)
{
 // 查找ObjectDataSource
 ObjectDataSource ods = Parent.FindControl(this.DataSourceID) as ObjectDataSource;
 if (ods != null)
 {
 ods.Selected += new ObjectDataSourceStatusEventHandler(ods_Selected);
 }
 base.OnLoad(e);
}
private int? _recordCount = null;
/// 
/// 计算总记录数
/// 
/// 
/// 
private void ods_Selected(object sender, ObjectDataSourceStatusEventArgs e)
{
 if (e.ReturnValue is IListSource)
 {
 _recordCount = ((IListSource) e.ReturnValue).GetList().Count;
 }
}
5、重写OnRowCreated以实现自定义分页样式 
复制C#代码保存代码/// 
/// OnRowCreated
/// 
/// 
protected override void OnRowCreated(GridViewRowEventArgs e)
{
 if (e.Row.RowType == DataControlRowType.Pager 
 && PagingStyle == Paging.PagingStyleCollection.Default)
 {
 LinkButton First = new LinkButton();
 LinkButton Prev = new LinkButton();
 LinkButton Next = new LinkButton();
 LinkButton Last = new LinkButton();
 TableCell tc = new TableCell();
 e.Row.Controls.Clear();
 tc.Controls.Add(new LiteralControl("  "));
 if (_recordCount.HasValue)
 {
 tc.Controls.Add(new LiteralControl(_recordCount.ToString()));
 tc.Controls.Add(new LiteralControl("  "));
 tc.Controls.Add(new LiteralControl(PageSize.ToString()));
 tc.Controls.Add(new LiteralControl("  "));
 }
 tc.Controls.Add(new LiteralControl((PageIndex + 1).ToString()));
 tc.Controls.Add(new LiteralControl("/"));
 tc.Controls.Add(new LiteralControl(PageCount.ToString()));
 tc.Controls.Add(new LiteralControl("    "));
 if (!String.IsNullOrEmpty(PagerSettings.FirstPageImageUrl))
 {
 First.Text = " <BR> + ") ";
";
 }
 else
 {
 First.Text = PagerSettings.FirstPageText;
 }
 First.CommandName = "Page";
 First.CommandArgument = "First";
 First.Font.Underline = false;
 if (!String.IsNullOrEmpty(PagerSettings.PreviousPageImageUrl))
 {
 Prev.Text = " <BR> + ") ";
";
 }
 else
 {
 Prev.Text = PagerSettings.PreviousPageText;
 }
 Prev.CommandName = "Page";
 Prev.CommandArgument = "Prev";
 Prev.Font.Underline = false;
 if (!String.IsNullOrEmpty(PagerSettings.NextPageImageUrl))
 {
 Next.Text = " <BR> + ") ";
";
 }
 else
 {
 Next.Text = PagerSettings.NextPageText;
 }
 Next.CommandName = "Page";
 Next.CommandArgument = "Next";
 Next.Font.Underline = false;
 if (!String.IsNullOrEmpty(PagerSettings.LastPageImageUrl))
 {
 Last.Text = " <BR> + ") ";
";
 }
 else
 {
 Last.Text = PagerSettings.LastPageText;
 }
 Last.CommandName = "Page";
 Last.CommandArgument = "Last";
 Last.Font.Underline = false;
 if (this.PageIndex <= 0)
 {
 First.Enabled = Prev.Enabled = false;
 }
 else
 {
 First.Enabled = Prev.Enabled = true;
 }
 tc.Controls.Add(First);
 tc.Controls.Add(new LiteralControl("  "));
 tc.Controls.Add(Prev);
 tc.Controls.Add(new LiteralControl("  "));
 // 当前页左边显示的数字分页按钮的数量
 int rightCount = (int) (PagerSettings.PageButtonCount / 2);
 // 当前页右边显示的数字分页按钮的数量
 int leftCount = PagerSettings.PageButtonCount % 2 == 0 ? rightCount - 1 : rightCount;
 for (int i = 0; i < PageCount; i++)
 {
 if (PageCount > PagerSettings.PageButtonCount)
 {
 if (i < PageIndex - leftCount 
 && PageCount - 1 - i > PagerSettings.PageButtonCount - 1)
 {
 continue;
 }
 else if (i > PageIndex + rightCount 
 && i > PagerSettings.PageButtonCount - 1)
 {
 continue;
 }
 }
 if (i == PageIndex)
 {
 tc.Controls.Add(new LiteralControl("" + (i + 1).ToString() + ""));
 }
 else
 {
 LinkButton lb = new LinkButton();
 lb.Text = (i + 1).ToString();
 lb.CommandName = "Page";
 lb.CommandArgument = (i + 1).ToString();
 tc.Controls.Add(lb);
 }
 tc.Controls.Add(new LiteralControl("  "));
 }
 if (this.PageIndex >= PageCount - 1)
 {
 Next.Enabled = Last.Enabled = false;
 }
 else
 {
 Next.Enabled = Last.Enabled = true;
 }
 tc.Controls.Add(Next);
 tc.Controls.Add(new LiteralControl("  "));
 tc.Controls.Add(Last);
 tc.Controls.Add(new LiteralControl("  "));
 tc.ColumnSpan = this.Columns.Count;
 e.Row.Controls.Add(tc);
 }
 base.OnRowCreated(e);
}
控件使用 
添加这个控件到工具箱里,然后拖拽到webform上,设置PagingStyle属性为Default,同时设置GridView的原有属性PageButtonCount,FirstPageText,PreviousPageText,NextPageText,LastPageText,FirstPageImageUrl,PreviousPageImageUrl,NextPageImageUrl,LastPageImageUrl 
ObjData.cs 
复制C#代码保存代码using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.ComponentModel;
/// 
/// OjbData 的摘要说明
/// 
public class OjbData
{
 public OjbData()
 {
 //
 // TOD 在此处添加构造函数逻辑
 //
 }
 [DataObjectMethod(DataObjectMethodType.Select, true)]
 public DataTable Select()
 {
 DataTable dt = new DataTable();
 dt.Columns.Add("no", typeof(string));
 dt.Columns.Add("name", typeof(string));
 for (int i = 0; i < 30; i++)
 {
 DataRow dr = dt.NewRow();
 dr[0] = "no" + i.ToString().PadLeft(2, '0');
 dr[1] = "name" + i.ToString().PadLeft(2, '0');
 dt.Rows.Add(dr);
 }
 return dt;
 }
}
Default.aspx 
复制ASPX代码保存代码<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
 SmartGridView测试
 
转自【webabcd-.NET】