您的位置:首页 > 编程语言 > C#

C#自定义改写GridView的分页控件功能

2009-07-25 15:15 507 查看
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Reflection;
using System.Text.RegularExpressions;

namespace ZLDK.JXGL.WebControls
{
[ToolboxData("<{0}:uGridView runat=server></{0}:uGridView>")]
public class uGridView : GridView, iuControl
{
//委托事件
public delegate void SelectNumberEventHandler(SelectNumberEventArgs e);

private static int summaryCount = 0; //保存其数量值
private Paging.PagingStyleCollection _pagingStyle; //是否要进行分页

#region 构造函数
public uGridView(): base()
{
ViewState["IsHandle"] = true;
ViewState["IsFixHeader"] = true;
// 新增“uGridView_RowDataBound”事件处理
this.RowDataBound += new GridViewRowEventHandler(uGridView_RowDataBound);
}
#endregion

#region 属性
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("")]
[Localizable(true)]
public string CodeID
{
get
{
String s = (String)ViewState["CodeID"];
return ((s == null) ? String.Empty : s);
}

set
{
ViewState["CodeID"] = value;
}
}

[Description("是否可以使用")]
[DefaultValue(true)]
public override bool Enabled
{
get
{

return base.Enabled;
}
set
{
if (IsHandle)
base.Enabled = value;
}
}

[Bindable(true)]
[Category("Appearance")]
[DefaultValue(true)]
[Localizable(true)]
[Description("是否可以编程控制Enabled")]
public bool IsHandle
{
get
{
return (bool)ViewState["IsHandle"];
}

set
{
ViewState["IsHandle"] = value;
}
}

/// <summary>
/// 是否固定表头?
/// </summary>
[Description("是否固定表头?"), Category("扩展"), DefaultValue(false), NotifyParentProperty(true)]
public virtual bool IsFixHeader
{
get { return (bool)ViewState["IsFixHeader"]; }
set { ViewState["IsFixHeader"] = value; }
}

//获取记录总数
[Description("数据总数"), DefaultValue("0"), Category("扩展")]
public int SummaryCount
{
get { return summaryCount; }
set { summaryCount = value; }
}

// 自定义分页样式
[Description("自定义分页样式"), DefaultValue("default"), Category("扩展")]
public Paging.PagingStyleCollection PagingStyle
{
get { return _pagingStyle; }
set { _pagingStyle = value; }
}

#endregion

#region 数据绑定事件

protected void uGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
//固定表头
if (this.IsFixHeader && e.Row.RowType == DataControlRowType.Header)
{
for (int j = 0; j < e.Row.Cells.Count; j++)
{
e.Row.Cells[j].Attributes.Add("style", " position: relative; top: expression(this.offsetParent.scrollTop-1);");
}
}
}

#endregion

#region 固定表头

protected override int CreateChildControls(System.Collections.IEnumerable dataSource, bool dataBinding)
{
if (dataSource == null)
{
DataControlField[] fieldArray = new DataControlField[this.Columns.Count];
this.Columns.CopyTo(fieldArray, 0);

if (fieldArray != null && fieldArray.Length > 0)
{
if (this.ShowHeader && (this.HeaderRow == null))
{
GridViewRow headerRow = null;
if (this.HeaderRow == null)
{
headerRow = this.CreateRow(-1, -1, DataControlRowType.Header, DataControlRowState.Normal);
this.InitializeRow(headerRow, fieldArray);
FieldInfo field = typeof(System.Web.UI.WebControls.GridView).GetField("_headerRow", BindingFlags.NonPublic | BindingFlags.Instance);
if (field != null)
{
field.SetValue(this, headerRow);
}
Table headerTable = this.CreateChildTable();
headerTable.Rows.Add(headerRow);
Controls.Add(headerTable);
}
else
{
headerRow = this.HeaderRow;
}

GridViewRowEventArgs args = new GridViewRowEventArgs(headerRow);

this.OnRowCreated(args);
if (dataBinding)
{
headerRow.DataBind();
this.OnRowDataBound(args);
headerRow.DataItem = null;
}
}
}
return 0;
}
else
{
return base.CreateChildControls(dataSource, dataBinding);
}
}
#endregion

#region 创建分页的各个控件
/// <summary>
/// 创建分页的各个控件
/// </summary>
/// <param name="e"></param>
protected override void OnRowCreated(GridViewRowEventArgs e)
{
#region 自定义分页样式

if (e.Row.RowType == DataControlRowType.Pager && PagingStyle == Paging.PagingStyleCollection.Default)
{
LinkButton First = new LinkButton();
First.ID = "First";
First.ToolTip = "首页";
First.CausesValidation = false;
LinkButton Prev = new LinkButton();
Prev.ID = "Prev";
Prev.ToolTip = "后一页";
Prev.CausesValidation = false;
LinkButton Next = new LinkButton();
Next.ID = "Next";
Next.ToolTip = "前一页";
Next.CausesValidation = false;
LinkButton Last = new LinkButton();
Last.ID = "Last";
Last.ToolTip = "尾页";
Last.CausesValidation = false;
TableCell tc = new TableCell();

e.Row.Controls.Clear();

#region “首页 上一页 下一页 尾页”按钮
if (!String.IsNullOrEmpty(PagerSettings.FirstPageImageUrl))
{
First.Text = "<img src='" + ResolveUrl(PagerSettings.FirstPageImageUrl) + "' border='0'/>";
}
else
{
First.Text = PagerSettings.FirstPageText;
// First.Text = "<font face='webdings'>9</font>";

}
First.CommandName = "First";
First.Font.Underline = false;

if (!String.IsNullOrEmpty(PagerSettings.PreviousPageImageUrl))
{
Prev.Text = "<img src='" + ResolveUrl(PagerSettings.PreviousPageImageUrl) + "' border='0'/>";
}
else
{
Prev.Text = PagerSettings.PreviousPageText;
// Prev.Text = "<font face='webdings'>3</font>";
}
Prev.CommandName = "Prev";
Prev.Font.Underline = false;

if (!String.IsNullOrEmpty(PagerSettings.NextPageImageUrl))
{
Next.Text = "<img src='" + ResolveUrl(PagerSettings.NextPageImageUrl) + "' border='0'/>";
}
else
{
Next.Text = PagerSettings.NextPageText;
//Next.Text = "<font face='webdings'>4</font>";
}
Next.CommandName = "Next";
Next.Font.Underline = false;

if (!String.IsNullOrEmpty(PagerSettings.LastPageImageUrl))
{
Last.Text = "<img src='" + ResolveUrl(PagerSettings.LastPageImageUrl) + "' border='0'/>";
}
else
{
Last.Text = PagerSettings.LastPageText;
//Last.Text = "<font face='webdings'>:</font>";
}
Last.CommandName = "Last";
Last.Font.Underline = false;

tc.Controls.Add(First);
tc.Controls.Add(new LiteralControl("  "));
tc.Controls.Add(Prev);
tc.Controls.Add(new LiteralControl("  "));

if (this.PageIndex <= 0)
{
First.Enabled = Prev.Enabled = false;
}
else
{
First.Enabled = Prev.Enabled = true;
}
tc.Controls.Add(Next);
tc.Controls.Add(new LiteralControl("  "));
tc.Controls.Add(Last);
tc.Controls.Add(new LiteralControl("  "));

if (this.PageIndex >= PageCount - 1)
{
Next.Enabled = Last.Enabled = false;
}
else
{
Next.Enabled = Last.Enabled = true;
}
#endregion

#region 显示总记录数 每页记录数 当前页数/总页数 /和加TextBox Button DropDownList控件

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("  共<b>"));
tc.Controls.Add(new LiteralControl(SummaryCount.ToString()));
tc.Controls.Add(new LiteralControl("</b>条记录  到"));
//添加输入框和按纽
TextBox txbDigit = new TextBox();
txbDigit.ID = "txbDigit";
txbDigit.Style.Add("width", "18px");
//txbDigit.Style.Add("height", "20px"); //height:20px;
tc.Controls.Add(txbDigit);
Button btnGoto = new Button();
btnGoto.ID = "btnGoto";
btnGoto.Text = "Go";
btnGoto.ToolTip = "查询";
btnGoto.Style.Add("cursor", "hand");
//btnGoto.Style.Add("height", "25px");
btnGoto.CommandName = "goto";
btnGoto.CausesValidation = false;
tc.Controls.Add(btnGoto);
tc.Controls.Add(new LiteralControl("  每页显示"));
//使用下拉框来进行
DropDownList ddlList = new DropDownList();
ddlList.ID = "ddlList";
ddlList.Items.Add(new ListItem("10", "10"));
ddlList.Items.Add(new ListItem("20", "20"));
ddlList.Items.Add(new ListItem("30", "30"));
ddlList.Items.Add(new ListItem("40", "40"));
ddlList.Items.Add(new ListItem("50", "50"));
ddlList.SelectedValue = PageSize.ToString(); //显示行数
ddlList.Style.Add("Width", "40px");
ddlList.AutoPostBack = true; //触发其响应事件
ddlList.SelectedIndexChanged += new EventHandler(DropDownList_SelectChanged);
tc.Controls.Add(ddlList);
tc.Controls.Add(new LiteralControl("条记录"));
#endregion

tc.ColumnSpan = this.Columns.Count;
PagerStyle.HorizontalAlign = HorizontalAlign.Right; // 分页栏显示在右边
e.Row.Controls.Add(tc);

}

#endregion
base.OnRowCreated(e);
}

#endregion

#region LinkButton和button的事件处理

protected override void OnRowCommand(GridViewCommandEventArgs e)
{
//处理每个控件的事件,让前台来进行接收处理
GridViewRow pagerRow = this.BottomPagerRow;
LinkButton lbFirst = (LinkButton)pagerRow.FindControl("First");
LinkButton lbPrev = (LinkButton)pagerRow.FindControl("Prev");
LinkButton lbNext = (LinkButton)pagerRow.FindControl("Next");
LinkButton lbLast = (LinkButton)pagerRow.FindControl("Last");

bool flag = true; //通过使用标识来判断
switch (e.CommandName)
{
case "First":
this.PageIndex = 0;
lbFirst.Enabled = lbPrev.Enabled = false;
lbNext.Enabled = lbLast.Enabled = true;
flag = true;

break;
case "Prev":
if (PageIndex >= 1)
{
this.PageIndex = PageIndex - 1;
lbFirst.Enabled = lbPrev.Enabled = true;
}
else
{
lbFirst.Enabled = lbPrev.Enabled = true;
}
lbNext.Enabled = lbLast.Enabled = true;
flag = true;
break;
case "Next":
if (PageIndex < PageCount - 1)
{
this.PageIndex = PageIndex + 1;
lbNext.Enabled = lbLast.Enabled = true;
}
else
{
lbNext.Enabled = lbLast.Enabled = false;
}
lbFirst.Enabled = lbPrev.Enabled = true;
flag = true;
break;
case "Last":
this.PageIndex = PageCount - 1;
lbFirst.Enabled = lbPrev.Enabled = true;
lbNext.Enabled = lbLast.Enabled = false;
flag = true;
break;
case "goto":
TextBox txbContent = (TextBox)this.BottomPagerRow.FindControl("txbDigit");
//使用正则表达式,验证输入的值
Match match = Regex.Match(txbContent.Text.Trim(), @"^[1-" + PageCount + "]$");
if (match.Success)
{
this.PageIndex = Convert.ToInt32(match.Value) - 1;
flag = true;
}
else
{
flag = false;
}
break;
}
//调用前台事件
if (flag)
{
//重新加载数据
EventArgs ea = new EventArgs();
DataBindingClick(this, ea);

}

base.OnRowCommand(e);
}

#endregion

#region 触发更新事件,用于LinkButtn和Button是触发事件

public event EventHandler ButtonClick;

protected virtual void DataBindingClick(object sender, EventArgs e)
{
if (ButtonClick != null)
{
ButtonClick(sender, e);
}
}

#endregion

#region dropdownlist的事件处理

public event SelectNumberEventHandler SelectNumber;

protected virtual void SelectNumberChanged(SelectNumberEventArgs e)
{
if (SelectNumber != null)
{
SelectNumber(e);
}
}

//把DropDownList选择得值返回给前台,让其进行操作,存入一个类中
protected void DropDownList_SelectChanged(object sender, EventArgs e)
{
DropDownList ddlSelect = sender as DropDownList;
SelectNumberEventArgs selectNum = new SelectNumberEventArgs(Convert.ToInt32(ddlSelect.SelectedValue));
SelectNumberChanged(selectNum);

}

#endregion

/// <summary>
/// 注册控件有scriptManager的页面,这样几个控件才能激活,它必须在Gridview绑定后才能注册
/// </summary>
/// <param name="smRegister">注册的对象</param>
public void RegisterControl(ScriptManager smRegister)
{
try
{
//注册触发控件
GridViewRow gvr = this.BottomPagerRow;
smRegister.RegisterAsyncPostBackControl(gvr.Cells[0].FindControl("First"));
smRegister.RegisterAsyncPostBackControl(gvr.Cells[0].FindControl("Prev"));
smRegister.RegisterAsyncPostBackControl(gvr.Cells[0].FindControl("Next"));
smRegister.RegisterAsyncPostBackControl(gvr.Cells[0].FindControl("Last"));
smRegister.RegisterAsyncPostBackControl(gvr.Cells[0].FindControl("btnGoto"));
smRegister.RegisterAsyncPostBackControl(gvr.Cells[0].FindControl("ddlList"));
}
catch
{ }

}
}

/// <summary>
/// 自定义分页相关
/// </summary>
public class Paging
{
/// <summary>
/// 自定义分页样式
/// </summary>
public enum PagingStyleCollection
{
/// <summary>
/// 不用自定义分页样式
/// </summary>
None,
/// <summary>
/// 默认自定义分页样式
/// </summary>
Default
}
}

//用来存储dropdownList选择的数据
public class SelectNumberEventArgs: EventArgs
{
private int selectDigit;
public SelectNumberEventArgs(int digit)
{
selectDigit = digit;
}

public int SelectNum
{
get
{
return selectDigit;
}
}
}
}
直接引用该uGridView,如果要想产生分页效果,那么几个属性必须设置
一个是AllowPaging="True" 和PagingStyle="default"
然后在HTML代码中加入样式,是指“首页、尾页”的显示样式
<PagerSettings
FirstPageText="<font face='webdings'>9</font>" PreviousPageText="<font face='webdings'>3</font>"
NextPageText="<font face='webdings'>4</font>" LastPageText="<font face='webdings'>:</font>" />

然后对该uGridView两个事件进行代码操作,主要就是重新绑定数据源

//加载客户信息
private void setGridView(int pageSize)
{
try
{
//根据选择条件得到数据
clsST_JC_KHXX[] st_xx=ywJC_KHXX.stSelectOuterKeyJC_KHXX("2");
if (st_xx == null)
{
uGridView1.DataSource = null;
uGridView1.DataBind();
return;
}
//绑定数据源共有多少条记录,并在分页栏中显示
uGridView1.SummaryCount = st_xx.Length;
//判断是否有每页显示的记录有否改变,如果改变必须把值直接赋给PageSize
if (pageSize != 0)
{
uGridView1.PageSize = pageSize;
}
uGridView1.DataSource = st_xx;
uGridView1.DataBind();

}
catch (Exception ex)
{
throw ex;
}
}
双击uGridView中ButtonClick(LinkButton、Button的触发)和SelectNumber(DropDownList)事件
在ButtonClick事件下直接重新绑定

protected void GridView1_ButtonClick(object sender, EventArgs e)
{
setGridView(0);
}
在SelectNumber事件下

protected void GridView1_SelectNumber(ZLDK.JXGL.WebControls.SelectNumberEventArgs e)
{
setGridView(e.SelectNum); //e.SelectNum是dropDownList选择的值, //ZLDK.JXGL.WebControls是命名控件下类SelectNumberEventArgs
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: