从datagrid继承,自定义一个控件,实现翻页。在点击翻页连接后就报错,“无效的currentPageIndex……要大于等于0且小于PageCount等等”,但是我输出CurrentPageIndex看到这个值没问题。不知道问题在哪里。各位大侠指教。源码如下:using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Design;
using System.Reflection;
using System.Globalization;
using System.Data;
using System.Xml;namespace MyWebCtrl
{
#region 说明
/// <summary>
/// DataGrid 的摘要说明。
/// </summary>
#endregion
[DefaultProperty("Text"), ToolboxBitmap(typeof(System.Web.UI.WebControls.DataGrid)),
ToolboxData("<{0}:DataGrid runat=server></{0}:DataGrid>")]
public class MyDataGrid : System.Web.UI.WebControls.DataGrid,INamingContainer,IPostBackEventHandler
{ #region Variable
private string sStartPage="首页";
private string sPrevPage="上页";
private string sNextPage="下页";
private string sEndPage="尾页";
//private int maxRecord=0;
private string pageCSS="scrollButton";
private const string PAGERBAR="共<font color=red>$MaxRecord$</font>条/每页<font color=red>$PageSize$</font>条 当前第<font color=red>$CurrentPage$</font>页/共<font color=red>$PageCount$</font>页";
private DropDownList ddlbottum;
private DropDownList ddltop;
private bool bottumflag =false;
Panel myPanel= new Panel();
LinkButton prevPage = new LinkButton();
LinkButton startPage = new LinkButton();
LinkButton nextPage = new LinkButton();
DropDownList numPage = new DropDownList();
LinkButton endPage = new LinkButton();
#endregion #region 事件
//public event DataGridPageChangedEventHandler PageIndexChanged;
protected override void OnPageIndexChanged(DataGridPageChangedEventArgs e)
{
this.CurrentPageIndex = e.NewPageIndex;
//this.DataBind();
base.OnPageIndexChanged (e);
} #endregion #region 属性
/// <summary>
/// 总记录数
/// </summary>
[Bindable(true),
Category("分页"),
Description("总记录数")]
public int MaxRecord
{
get
{
object obj=ViewState["maxRecord"];
return ((null ==obj ) ? 0 : Convert.ToInt32( obj));
}
set
{
VirtualItemCount = (value-1) / PageSize+1;
ViewState["maxRecord"]=value;
}
}
[Bindable(true),
Category("翻页"),
DefaultValue("首页"),Description("回到首页")]
public string StartPage
{
get
{
return sStartPage;
}
set
{
sStartPage=value;
}
}
[Bindable(true),
Category("翻页"),
DefaultValue("尾页"),Description("回到尾页")]
public string EndPage
{
get
{
return sEndPage;
}
set
{
sEndPage=value;
}
}
[Bindable(true),
Category("翻页"),
DefaultValue("上页"),Description("上一页")]
public string PrevPage
{
get
{
return sPrevPage;
}
set
{
sPrevPage=value;
}
}
[Bindable(true),
Category("翻页"),
DefaultValue("下页"),Description("下一页")]
public string NextPage
{
get
{
return sNextPage;
}
set
{
sNextPage=value;
}
}
[Bindable(true),
Category("翻页外观"),
DefaultValue(""),Description("按钮的CSS")]
public string PageCSS
{
get
{
return pageCSS;
}
set
{
pageCSS=value;
}
}
/// <summary>
///
/// </summary>
[DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Hidden)]
[BrowsableAttribute(false)]
[DescriptionAttribute("DataGrid_PageCount")]
public new int PageCount
{
get
{
if (PagerStyle.Mode == PagerMode.NextPrev)
{
return VirtualItemCount;
}
else
{
return base.PageCount;
}
}
}
//
// /// <summary>
// ///
// /// </summary>
// [DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Visible)]
// [BrowsableAttribute(true)]
// [DescriptionAttribute("DataGrid_DataSource")]
// public override object DataSource
// {
// get
// {
// object obj = base.ViewState["DataSource"];
// if (obj!=null)
// {
// return obj;
// }
// else
// {
// return base.DataSource;
// }
// }
// set
// {
// if(value!=null)
// {
// base.ViewState["DataSource"] = value;
// }
// }
// }
//
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Design;
using System.Reflection;
using System.Globalization;
using System.Data;
using System.Xml;namespace MyWebCtrl
{
#region 说明
/// <summary>
/// DataGrid 的摘要说明。
/// </summary>
#endregion
[DefaultProperty("Text"), ToolboxBitmap(typeof(System.Web.UI.WebControls.DataGrid)),
ToolboxData("<{0}:DataGrid runat=server></{0}:DataGrid>")]
public class MyDataGrid : System.Web.UI.WebControls.DataGrid,INamingContainer,IPostBackEventHandler
{ #region Variable
private string sStartPage="首页";
private string sPrevPage="上页";
private string sNextPage="下页";
private string sEndPage="尾页";
//private int maxRecord=0;
private string pageCSS="scrollButton";
private const string PAGERBAR="共<font color=red>$MaxRecord$</font>条/每页<font color=red>$PageSize$</font>条 当前第<font color=red>$CurrentPage$</font>页/共<font color=red>$PageCount$</font>页";
private DropDownList ddlbottum;
private DropDownList ddltop;
private bool bottumflag =false;
Panel myPanel= new Panel();
LinkButton prevPage = new LinkButton();
LinkButton startPage = new LinkButton();
LinkButton nextPage = new LinkButton();
DropDownList numPage = new DropDownList();
LinkButton endPage = new LinkButton();
#endregion #region 事件
//public event DataGridPageChangedEventHandler PageIndexChanged;
protected override void OnPageIndexChanged(DataGridPageChangedEventArgs e)
{
this.CurrentPageIndex = e.NewPageIndex;
//this.DataBind();
base.OnPageIndexChanged (e);
} #endregion #region 属性
/// <summary>
/// 总记录数
/// </summary>
[Bindable(true),
Category("分页"),
Description("总记录数")]
public int MaxRecord
{
get
{
object obj=ViewState["maxRecord"];
return ((null ==obj ) ? 0 : Convert.ToInt32( obj));
}
set
{
VirtualItemCount = (value-1) / PageSize+1;
ViewState["maxRecord"]=value;
}
}
[Bindable(true),
Category("翻页"),
DefaultValue("首页"),Description("回到首页")]
public string StartPage
{
get
{
return sStartPage;
}
set
{
sStartPage=value;
}
}
[Bindable(true),
Category("翻页"),
DefaultValue("尾页"),Description("回到尾页")]
public string EndPage
{
get
{
return sEndPage;
}
set
{
sEndPage=value;
}
}
[Bindable(true),
Category("翻页"),
DefaultValue("上页"),Description("上一页")]
public string PrevPage
{
get
{
return sPrevPage;
}
set
{
sPrevPage=value;
}
}
[Bindable(true),
Category("翻页"),
DefaultValue("下页"),Description("下一页")]
public string NextPage
{
get
{
return sNextPage;
}
set
{
sNextPage=value;
}
}
[Bindable(true),
Category("翻页外观"),
DefaultValue(""),Description("按钮的CSS")]
public string PageCSS
{
get
{
return pageCSS;
}
set
{
pageCSS=value;
}
}
/// <summary>
///
/// </summary>
[DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Hidden)]
[BrowsableAttribute(false)]
[DescriptionAttribute("DataGrid_PageCount")]
public new int PageCount
{
get
{
if (PagerStyle.Mode == PagerMode.NextPrev)
{
return VirtualItemCount;
}
else
{
return base.PageCount;
}
}
}
//
// /// <summary>
// ///
// /// </summary>
// [DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Visible)]
// [BrowsableAttribute(true)]
// [DescriptionAttribute("DataGrid_DataSource")]
// public override object DataSource
// {
// get
// {
// object obj = base.ViewState["DataSource"];
// if (obj!=null)
// {
// return obj;
// }
// else
// {
// return base.DataSource;
// }
// }
// set
// {
// if(value!=null)
// {
// base.ViewState["DataSource"] = value;
// }
// }
// }
//
/// /
/// </summary>
[BrowsableAttribute(false)]
[BindableAttribute(true)]
[DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Hidden)]
[DescriptionAttribute("DataGrid_CurrentPageIndex")]
public int CurrentPage
{
get
{
object local = base.ViewState["CurrentPage"];
if (local != null)
{
return (int)local;
}
else
{
return 0;
}
} set
{
if (value < 0)
{
throw new ArgumentOutOfRangeException("value");
}
base.ViewState["CurrentPage"] = value;
}
}
#endregion #region 构造
/*
public DataGrid():base(){
}*/
#endregion #region Method protected override void OnInit(EventArgs e)
{
EnableViewState = true;
//CssClass="coolGrid";
base.OnInit(e);
//this.Attributes["cols"] = this.Columns.Count+"";
}
protected override void OnPreRender(EventArgs e)
{
OnDropDownListEvent(e,ddltop);
OnDropDownListEvent(e , ddlbottum);
Page.GetPostBackEventReference(this); //在呈现页面前计算好共有多少行数据
DataSet ds1;
ds1 = (DataSet)this.DataSource;
this.MaxRecord = ds1.Tables[this.DataMember].Rows.Count;
//
}
private void OnDropDownListEvent(EventArgs e , DropDownList ddl)
{
if(ddl != null)
{
if(Convert.ToInt32( ddl.SelectedValue ) !=CurrentPage )
{
OnPageIndexChanged(new DataGridPageChangedEventArgs(e,Convert.ToInt32( ddl.SelectedValue )));
}
}
}
protected override void OnItemDataBound(DataGridItemEventArgs e)
{
base.OnItemDataBound(e);
}
protected override void OnItemCommand(DataGridCommandEventArgs e)
{
base.OnItemCommand(e);
}
protected override bool OnBubbleEvent(object source,EventArgs e)
{
if(source is DataGridItem)
{
if(PagerStyle.Mode == PagerMode.NextPrev)
{
DataGridCommandEventArgs dge = (DataGridCommandEventArgs)e;
if(dge.CommandName.Equals("Page"))
{
OnPageIndexChanged(new DataGridPageChangedEventArgs(dge.Item,Convert.ToInt32( dge.CommandArgument)));
}
return true;
}
}
return base.OnBubbleEvent( source,e);
}
protected override void InitializeItem(DataGridItem item, DataGridColumn[] columns)
{
base.InitializeItem(item,columns);
}
/// <summary>
///
/// </summary>
/// <param name="ddl"></param>
/// <param name="tableCell"></param>
private void InitializeDropDownList(ref DropDownList ddl , TableCell tableCell)
{
ddl = new DropDownList();
ddl.AutoPostBack = true;
for(int i=0;i<PageCount;i++)
{
ddl.Items.Add( new ListItem ( (i+1)+"", i + "" ) );
}
ddl.ClearSelection();
ddl.SelectedIndex = CurrentPage;
tableCell.Controls.Add(new LiteralControl("到第"));
tableCell.Controls.Add( ddl );
tableCell.Controls.Add(new LiteralControl("页"));
}
// protected override void InitializePager(DataGridItem item, int columnSpan, PagedDataSource pagedDataSource)
// {
// TableCell tableCell = new TableCell();
// tableCell.ColumnSpan = columnSpan;
// DataGridPagerStyle dataGridPagerStyle = PagerStyle;
// if (PagerStyle.Mode == PagerMode.NextPrev)
// {
// tableCell.Controls.Add(new LiteralControl("<table class="+PageCSS+" width=100%> <tr><td nowrap>"));
// tableCell.Controls.Add(new LiteralControl( PAGERBAR.Replace("$MaxRecord$",MaxRecord+"").Replace("$PageSize$",PageSize+"").Replace("$CurrentPage$",(CurrentPage+1)+"").Replace("$PageCount$",VirtualItemCount+"")) );
// tableCell.Controls.Add(new LiteralControl("</td><td>"));
// bool pageflag = (CurrentPage != 0 );
// // if (CurrentPage != 0)
// // {
// LinkButton link1 = new LinkButton();
// link1.Text = sStartPage;
// link1.CommandName = "Page";
// link1.CommandArgument = "0";///"First";
// link1.CausesValidation = false;
// link1.Enabled = true;//pageflag;
// tableCell.Controls.Add(link1);
// tableCell.Controls.Add(new LiteralControl(" "));
// LinkButton linkButton1 = new LinkButton();
// linkButton1.Text = sPrevPage;
// linkButton1.CommandName = "Page";
// linkButton1.CommandArgument = (CurrentPage-1)+"" ;//"Prev";
// linkButton1.CausesValidation = false;
// linkButton1.Enabled = true;//pageflag;
// tableCell.Controls.Add(linkButton1);
// // }
// // else
// // {
// // tableCell.Controls.Add(new LiteralControl(" "));
// // }
// tableCell.Controls.Add(new LiteralControl(" "));
// //if (!pagedDataSource.IsLastPage)
// // if(CurrentPage< VirtualItemCount -1)
// // {
// pageflag = (CurrentPage< VirtualItemCount -1 );
// LinkButton linkButton2 = new LinkButton();
// linkButton2.Text = sNextPage;
// linkButton2.CommandName = "Page";
// linkButton2.CommandArgument = (CurrentPage+1)+"" ; //"Next";
// linkButton2.CausesValidation = false;
// linkButton2.Enabled = true;//pageflag;
// tableCell.Controls.Add(linkButton2);
// tableCell.Controls.Add(new LiteralControl(" "));
// LinkButton link2 = new LinkButton();
// link2.Text = sEndPage;
// link2.CommandName = "Page";
// link2.CommandArgument = (PageCount-1)+""; //"Last";
// link2.CausesValidation = false;
// link2.Enabled = true;//pageflag;
// tableCell.Controls.Add(link2);
//
// // }
// // else
// // {
// // tableCell.Controls.Add(new LiteralControl(" "));
// // }
// tableCell.Controls.Add(new LiteralControl("</td><td nowrap align='right'>"));
// if(!bottumflag)
// {
// InitializeDropDownList(ref ddlbottum ,tableCell);
// }
// else
// {
// InitializeDropDownList(ref ddltop ,tableCell);
// }
// bottumflag=!bottumflag;
// tableCell.Controls.Add(new LiteralControl("</td></tr></table>"));
// }
// else
// {
// int i1 = pagedDataSource.PageCount;
// int j1 = pagedDataSource.CurrentPageIndex + 1;
// int k1 = dataGridPagerStyle.PageButtonCount;
// int i2 = k1;
// if (i1 < i2)
// {
// i2 = i1;
// }
// int j2 = 1;
// int k2 = i2;
// if (j1 > k2)
// {
// j2 = pagedDataSource.CurrentPageIndex / k1 * k1 + 1;
// k2 = j2 + k1 - 1;
// if (k2 > i1)
// {
// k2 = i1;
// }
// if (k2 - j2 + 1 < k1)
// {
// j2 = Math.Max(1, k2 - k1 + 1);
// }
// }
// if (j2 != 1)
// {
// LinkButton linkButton3 = new LinkButton();
// linkButton3.Text = "...";
// linkButton3.CommandName = "Page";
// int k3 = j2 - 1;
// linkButton3.CommandArgument = k3.ToString(NumberFormatInfo.InvariantInfo);
// linkButton3.CausesValidation = false;
// tableCell.Controls.Add(linkButton3);
// tableCell.Controls.Add(new LiteralControl(" "));
// }
// for (int j3 = j2; j3 <= k2; j3++)
// {
// string str = j3.ToString(NumberFormatInfo.InvariantInfo);
// if (j3 == j1)
// {
// Label label3 = new Label();
// label3.Text = str;
// tableCell.Controls.Add(label3);
// }
// else
// {
// LinkButton linkButton3 = new LinkButton();
// linkButton3.Text = str;
// linkButton3.CommandName = "Page";
// linkButton3.CommandArgument = str;
// linkButton3.CausesValidation = false;
// tableCell.Controls.Add(linkButton3);
// }
// if (j3 < k2)
// {
// tableCell.Controls.Add(new LiteralControl(" "));
// }
// }
// if (i1 > k2)
// {
// tableCell.Controls.Add(new LiteralControl(" "));
// LinkButton linkButton3 = new LinkButton();
// linkButton3.Text = "...";
// linkButton3.CommandName = "Page";
// int k3 = k2 + 1;
// linkButton3.CommandArgument = k3.ToString(NumberFormatInfo.InvariantInfo);
// linkButton3.CausesValidation = false;
// tableCell.Controls.Add(linkButton3);
// }
// }
// item.Cells.Add(tableCell);
// } /// <summary>
/// 捕获回发事件
/// </summary>
/// <param name="eventArgument">命令行</param>
public void RaisePostBackEvent(string eventArgument)
{
int NewPageIndex=0;
if(PagerStyle.Position.Equals(PagerPosition.Bottom))
{
CurrentPageIndex=Convert.ToInt32( Page.Request.Params[this.UniqueID+":numPageBottom"])-1;
}
else
{
CurrentPageIndex=Convert.ToInt32( Page.Request.Params[this.UniqueID+":numPageTop"])-1;
}
if("prevPage".Equals( eventArgument))
{
NewPageIndex=CurrentPageIndex-1;
}
else if("nextPage".Equals( eventArgument))
{
NewPageIndex=CurrentPageIndex+1;
}
else if(eventArgument.StartsWith("endPage" ))
{
NewPageIndex=Convert.ToInt32(eventArgument.Substring(7));
}
else if("numPageTop".Equals( eventArgument))
{
NewPageIndex=Convert.ToInt32( Page.Request.Params[this.UniqueID+":numPageTop"])-1;
}
else if("numPageBottom".Equals( eventArgument))
{
NewPageIndex=Convert.ToInt32( Page.Request.Params[this.UniqueID+":numPageBottom"])-1;
}
this.CurrentPageIndex = NewPageIndex;
OnPageIndexChanged(new DataGridPageChangedEventArgs(this,NewPageIndex));
//this.CurrentPageIndex = NewPageIndex;
//this.DataBind();
} // protected override void OnPageIndexChanged(DataGridPageChangedEventArgs e)
// {
// int i = this.CurrentPageIndex;
// this.DataBind();
// base.OnPageIndexChanged (e);
// } protected override void OnLoad(EventArgs e)
{
// DataSet ds1;
// ds1 = (DataSet)this.DataSource;
// this.MaxRecord = ds1.Tables[this.DataMember].Rows.Count;
EnableViewState = true;
base.OnLoad (e);
} /// <summary>
/// 将此控件呈现给指定的输出参数。
/// </summary>
/// <param name="output"> 要写出到的 HTML 编写器 </param>
/// protected override void Render(HtmlTextWriter output)
{
output.Write(this.CurrentPageIndex+"<br>");
output.Write(this.DataSource.ToString()+"<br>");
output.Write(this.DataMember+"<br>");
DataSet ds1 = new DataSet();
ds1 = (DataSet)this.DataSource;
output.Write( ds1.Tables[this.DataMember].Rows.Count.ToString()+"<br>");
output.Write(this.PageCount+"<br>"); if(CurrentPageIndex>=PageCount)
{
CurrentPageIndex=PageCount;
}
if(CurrentPageIndex<=0)
{
CurrentPageIndex=0;
}
//this.DataBind();
if(AllowPaging)
{
AllowPaging=true;
this.PagerStyle.Visible=false;//false;
myPanel.CopyBaseAttributes(this);
Style.Remove("POSITION");
Style.Remove("Z-INDEX");
myPanel.RenderBeginTag(output);
Table table=new Table();
table.CopyBaseAttributes(this);
table.BackColor=(PagerStyle.BackColor.Equals(Color.Empty))?this.BackColor:PagerStyle.BackColor;
table.BackImageUrl=BackImageUrl;
table.BorderColor=PagerStyle.BorderColor.IsEmpty?BorderColor:PagerStyle.BorderColor;
table.BorderStyle=PagerStyle.BorderStyle;
table.BorderWidth=Unit.Point(0);//(PagerStyle.BorderWidth.IsEmpty)?BorderWidth:PagerStyle.BorderWidth;
table.HorizontalAlign=this.HorizontalAlign;
table.Width=Width;
table.CellPadding=CellPadding;
table.CellSpacing=CellSpacing;
table.GridLines=GridLines;
table.Font.Size=FontUnit.Point(9);
TableRow tr=new TableRow();
table.Controls.Add(tr);
TableCell td=new TableCell();
startPage.CssClass=pageCSS;
startPage.Text=sStartPage;
prevPage.CssClass=pageCSS;
prevPage.Text=sPrevPage;
nextPage.CssClass=pageCSS;
nextPage.Text=sNextPage;
endPage.CssClass=pageCSS;
endPage.Text=sEndPage;
numPage.CssClass=pageCSS;
tr.Controls.Add(td);
td.Attributes["style"]="BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BORDER-BOTTOM-STYLE: none";
td.Controls.Add(new LiteralControl(" 共<font color=red>"+MaxRecord+"</font>条/每页<font color=red>"+PageSize+"</font>条"));
td.Controls.Add(new LiteralControl(" 当前第<font color=red>"+(CurrentPageIndex+1)+"</font>页/共<font color=red>"+PageCount+"</font>页"));
td.Controls.Add(new LiteralControl("</td><td style=\"BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BORDER-BOTTOM-STYLE: none\">"));
//if(CurrentPageIndex!=0)
//{
startPage.Attributes["href"]=temps;
prevPage.Attributes["href"]="javascript:"+Page.GetPostBackEventReference(this,"prevPage");
td.Controls.Add(startPage);
td.Controls.Add(new LiteralControl(" "));
td.Controls.Add(prevPage);
td.Controls.Add(new LiteralControl(" "));
//}
//else
//{
//td.Controls.Add(new LiteralControl(" "));
//}
//if(CurrentPageIndex<(PageCount-1))
//{
/////////
nextPage.Attributes["href"]="javascript:"+Page.GetPostBackEventReference(this,"nextPage");
// nextPage.Attributes["id"]="next";
// nextPage.Attributes["href"]="";
// nextPage.Attributes["runat"]="server";
// nextPage.Attributes["onclick"]="PagerButtonClick";
// nextPage.Attributes["CommandArgument"] = "next";
endPage.Attributes["href"]="javascript:"+Page.GetPostBackEventReference(this,"endPage"+(PageCount-1));
td.Controls.Add(nextPage);
td.Controls.Add(new LiteralControl(" "));
td.Controls.Add(endPage);
td.Controls.Add(new LiteralControl(" "));
//}
//else
//{
//td.Controls.Add(new LiteralControl(" "));
//}
for(int i=0;i<PageCount;i++)
{
ListItem list=new ListItem((i+1).ToString());
if(i==CurrentPageIndex) list.Selected=true;
numPage.Items.Add(list);
}
td.Controls.Add(new LiteralControl("</td><td align=right style=\"BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BORDER-BOTTOM-STYLE: none\">转到第"));
td.Controls.Add(numPage);
td.Controls.Add(new LiteralControl("页"));
if(PagerStyle.Position==PagerPosition.Top||PagerStyle.Position==PagerPosition.TopAndBottom)
{
numPage.ID=this.UniqueID+":numPageTop";
numPage.Attributes["onchange"]=Page.GetPostBackEventReference(this,"numPageTop");
table.RenderControl(output);
}
base.Render(output);
if(PagerStyle.Position==PagerPosition.Bottom||PagerStyle.Position==PagerPosition.TopAndBottom)
{
numPage.ID=this.UniqueID+":numPageBottom";
numPage.Attributes["onchange"]=Page.GetPostBackEventReference(this,"numPageBottom");
table.RenderControl(output);
}
myPanel.RenderEndTag(output);
}
else
{
base.Render(output);
}
EnableViewState=true;//false;
} #endregion
}
}