从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>条&nbsp;当前第<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;
// }
// }
// }
//

解决方案 »

  1.   

    还有  /// <summary>
    /// /
    /// </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("&nbsp;"));
    // 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("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"));
    // //                }
    // tableCell.Controls.Add(new LiteralControl("&nbsp;&nbsp;"));
    // //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("&nbsp;"));
    // 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("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"));
    // //                }
    // 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
      

  2.   

    还有
    // {
    // 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("&nbsp;"));
    // }
    // 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("&nbsp;"));
    // }
    // }
    // if (i1 > k2)
    // {
    // tableCell.Controls.Add(new LiteralControl("&nbsp;"));
    // 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("&nbsp;&nbsp;共<font color=red>"+MaxRecord+"</font>条/每页<font color=red>"+PageSize+"</font>条"));
    td.Controls.Add(new LiteralControl("&nbsp;当前第<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)
    //{
      

  3.   

    string temps ="javascript:"+Page.GetPostBackEventReference(this,"startPage");
    startPage.Attributes["href"]=temps;
    prevPage.Attributes["href"]="javascript:"+Page.GetPostBackEventReference(this,"prevPage");
    td.Controls.Add(startPage);
    td.Controls.Add(new LiteralControl("&nbsp;"));
    td.Controls.Add(prevPage);
    td.Controls.Add(new LiteralControl("&nbsp;"));
    //}
    //else
    //{
    //td.Controls.Add(new LiteralControl("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"));
    //}
    //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("&nbsp;"));
    td.Controls.Add(endPage);
    td.Controls.Add(new LiteralControl("&nbsp;"));
    //}
    //else
    //{
    //td.Controls.Add(new LiteralControl("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"));
    //}
    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
    }
    }
      

  4.   

    PageIndexChanged这个方法有问题吧?