play with:1.PageControl.cs (compile it into WebControlLibrary1.dll and copy it to the bin subdirectory or use the toolbox):using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;namespace WebControlLibrary1
{
[ToolboxData("<{0}:PageControl runat=server></{0}:PageControl>")]
public class PageControl : System.Web.UI.Control, INamingContainer
{
Label mlbl;
Table mtbl;
int mPageCount;
LinkButton[] mbuttons; public int PageSize
{
get
{
object o = ViewState["PageSize"];
if (o == null)
return 1;
else
return (int)o;
}
set
{
ViewState["PageSize"] = value;
}
} public int CurrentPage
{
get
{
object o = ViewState["CurrentPage"];
if (o == null)
return 0;
else
return (int)o;
}
set
{
ViewState["CurrentPage"] = value;
}
} public int TotalCount
{
get
{
object o = ViewState["TotalCount"];
if (o == null)
return 0;
else
return (int)o;
}
set
{
ViewState["TotalCount"] = value;
}
} protected override void CreateChildControls()
{
//create a header
mlbl = new Label();
Controls.Add(mlbl); //create a container:
mtbl = new Table();
Controls.Add(mtbl); //determine number of pages
mPageCount = TotalCount /PageSize;
if ( mPageCount * PageSize < TotalCount)
mPageCount++;

//create buttons
mbuttons = new LinkButton[mPageCount]; for (int i=0; i < mPageCount; i++)
{
mbuttons[i] = new LinkButton();
mbuttons[i].Text = (i+1).ToString();
mbuttons[i].ID = "LB" + (i+1).ToString();
mbuttons[i].Click += new EventHandler(LinkButtonClick);
Controls.Add(mbuttons[i]);
Controls.Add(new LiteralControl("&nbsp;&nbsp;"));
}
} void LinkButtonClick(Object sender, EventArgs e)
{
LinkButton lb = (LinkButton)sender;
CurrentPage = Convert.ToInt32(lb.Text) - 1;
} protected override void OnPreRender(EventArgs e)
{
base.OnPreRender (e); mlbl.Text = "Page " + (CurrentPage+1).ToString();
int nStart = CurrentPage * PageSize;
int nEnd = (CurrentPage + 1)* PageSize ;
if (nEnd >TotalCount)
nEnd = TotalCount; mtbl.Rows.Clear();
mtbl.GridLines = GridLines.Both;
for (int i=nStart; i < nEnd; i++)
{
TableRow tr = new TableRow();
TableCell tc = new TableCell();
tc.Text = i.ToString();
tr.Cells.Add(tc);
mtbl.Rows.Add(tr);
} for (int i= 0 ; i < mbuttons.Length; i++)
if (CurrentPage == i)
mbuttons[i].Enabled = false;
else
mbuttons[i].Enabled = true;

}
}
}
2. WebForm.aspx:
<%@ Register TagPrefix="cc1" Namespace="WebControlLibrary1" Assembly="WebControlLibrary1" %>
    <form id="Form1" method="post" runat="server">
<cc1:PageControl id=PageControl1 runat="server" TotalCount="22" PageSize="4"></cc1:PageControl>
     </form>

解决方案 »

  1.   

    the above method uses a loop, which might be efficient, try
    protected override void CreateChildControls() {
    {
      ....
     mbuttons = new LinkButton[mPageCount];
     for (int i=0; i < mPageCount; i++)
     {
    ...
     } mbuttons[CurrentPage].Enabled=true;
    }
    protected override void OnPreRender(EventArgs e)
    { ...
     //remove the loop, but use
     mbuttons[CurrentPage].Enabled = false;
    }
      

  2.   

    谢谢,但是还有一个问题,for (int i=0; i < mPageCount; i++)如果i=n,n在如下方法中改变:在creatctronl中有事件
    lbNextn.Click += new EventHandler(this.Next_nButtonClicked);
    事件方法:
      private void Next_nButtonClicked(Object sender, EventArgs e)
    {

    n=n+10;

    }
    结果在实际运行中,lbNextn点两次才有效,事件的创建和linkbutton的创建在一起,我不知道该如何解决该问题?
      

  3.   

    make sure the content is created or refreshed in OnPreRender, because Next_nButtonClicked is called before OnPreRender
      

  4.   

    建议用重写Render输出自己定义的html代码,那样的执行速度会更快。
      

  5.   

    毕竟复合控件比呈现控件速度要慢
    看ms-help://MS.netframeworksdk.chs/cpguidenf/html/cpconcompositionvsrendering.htm
      

  6.   

    如果要放在OnPreRender中,lbNextn.Click += new EventHandler(this.Next_nButtonClicked);事件也不得不放在OnPreRender中,会有问题么?
      

  7.   

    思归,如果for (int i=0; i < mPageCount; i++)中的i的初值不是0,而是一个变量,怎么写??
      

  8.   

    "如果for (int i=0; i < mPageCount; i++)中的i的初值不是0,而是一个变量,怎么写??"
    什么变量?int类型的不是都可以作为i的初值吗?
    如果是其他的类型,只要是集合,也可以用foreach()阿
      

  9.   

    思归,我的内容呈现是在Render中用rendercontrol的方式实现的,Next_nButton及其Clicked 事件都是在creatcontrol中创建的,为什么还是出现点击两次才能执行的情况:
       LinkButton[] GoPage=new LinkButton[nTotalPage+2];
    protected override void CreateChildControls() 
    {
    for(int n=paranstart;n<=nEndPage;n++)
     {
       GoPage[n]=new LinkButton();
       GoPage[n].Text="["+n.ToString()+"]";
       GoPage[n].ID="GoPage"+n.ToString();
       GoPage[n].Click+=new EventHandler(this.Gopageclicked);
       nagcell.Controls.Add(GoPage[n]);
       nagcell.Controls.Add(new LiteralControl("&nbsp;"));
    }
               
    lbNextn = new LinkButton();
    lbNextn.ID="Nextn"; lbNextn.Click += new EventHandler(this.Next_nButtonClicked);
    nagcell.Controls.Add(lbNextn); nagcell.Controls.Add(new LiteralControl("&nbsp;")); private void Next_nButtonClicked(Object sender, EventArgs e)
    {

    paranstart=paranstart+10;
    CurrentPageIndex=Parastartpage-1;
    nStartcount=Parastartpage*PageSize;

    }
    }
      

  10.   

    suggest you read the following article and understand what the event order is and how postback works:http://www.aspalliance.com/PaulWilson/Articles/?id=6
      

  11.   

    知道过程也不知道怎样怎样写上面的linkbutton,另外可以在onprerender 写事件么?
      

  12.   

    思归,我怎么才能跟你说清楚,linkbutton数组的变量值并不是从0开始的,而是从另一个变量开始的,而这个变量是用另一个事件控制,比如我点击按钮“下10页”,则linkbutton数组从mbuttons[10]开始!
      

  13.   

    思归,有没有办法将按钮post到render里呢?
      

  14.   

    下面代码看不懂,不知可否解决问题?   
    bool IPostBackDataHandler.LoadPostData(string postDataKey, 
                NameValueCollection values) {
                // UserInputName is defined in LoginUI.
                _userName = values[UserNameInputName ];            // PasswordInputName is defined in LoginUI.
                _password = values[PasswordInputName];            // Check whether the button was clicked on the 
                // client. If it was, tell the page to 
                // invoke IPostBackEventHandler.RaisePostBackEvent.
                // ButtonName is defined in LoginUI.
                string buttonValue = values[ButtonName];
                bool buttonClicked = 
                    (buttonValue != null) && (buttonValue.Length != 0);
                if (buttonClicked) Page.RegisterRequiresRaiseEvent(this);            // Return false because we do not want to raise a 
                // changed event.
                return false;
            }        void IPostBackDataHandler.RaisePostDataChangedEvent() {
            }        void IPostBackEventHandler.RaisePostBackEvent(
                string eventArgument) {
                OnLogon(EventArgs.Empty);
            }        protected virtual void OnLogon(EventArgs e) { 
                EventHandler logonHandler = 
                    (EventHandler)Events[EventLogon];
                if (logonHandler != null) {
                    logonHandler(this, e);
                }  
            }        protected override void OnPreRender(EventArgs e) {
                base.OnPreRender(e);
                Page.RegisterRequiresPostBack(this);
            }        protected override void Render(HtmlTextWriter writer) {
                // Ensures that this control is nested in a server form.
                if (Page != null) {
                    Page.VerifyRenderingInServerForm(this);
                }
                base.Render(writer);
            }
        }
    }
      

  15.   

    here is something you can play with, I don't have time to go through it carefully, so it may not work properly:using System;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.ComponentModel;namespace CustomControls
    { [ToolboxData("<{0}:MyPageControl runat=server></{0}:MyPageControl>")]
    public class MyPageControl : System.Web.UI.Control, INamingContainer
    {
    const int nPagerCount = 10;
    Label mlbl;
    Table mtbl;
    int mPageCount;
    LinkButton btnPrev;
    LinkButton btnNext;
    LinkButton[] mbuttons; public int PageSize
    {
    get
    {
    object o = ViewState["PageSize"];
    if (o == null)
    return 1;
    else
    return (int)o;
    }
    set
    {
    ViewState["PageSize"] = value;
    }
    } public int CurrentPage
    {
    get
    {
    object o = ViewState["CurrentPage"];
    if (o == null)
    return 0;
    else
    return (int)o;
    }
    set
    {
    ViewState["CurrentPage"] = value;
    }
    } public int CurrentTab
    {
    get
    {
    object o = ViewState["CurrentTab"];
    if (o == null)
    return 0;
    else
    return (int)o;
    }
    set
    {
    ViewState["CurrentTab"] = value;
    }
    } public int TotalCount
    {
    get
    {
    object o = ViewState["TotalCount"];
    if (o == null)
    return 0;
    else
    return (int)o;
    }
    set
    {
    ViewState["TotalCount"] = value;
    }
    } protected override void CreateChildControls()
    {
    //create a header
    mlbl = new Label();
    Controls.Add(mlbl); //create a container:
    mtbl = new Table();
    Controls.Add(mtbl); //determine number of pages
    mPageCount = TotalCount /PageSize;
    if ( mPageCount * PageSize < TotalCount)
    mPageCount++;

    //create buttons
    btnPrev = new LinkButton();
    btnPrev.ID="PreTen";
    btnPrev.Text = "Previous 10";
    btnPrev.Click += new EventHandler(LinkButtonClick);
    Controls.Add(btnPrev);
    Controls.Add(new LiteralControl("&nbsp;&nbsp;")); mbuttons = new LinkButton[nPagerCount];

    for (int i=0; i < nPagerCount; i++)
    {
    mbuttons[i] = new LinkButton();
    //mbuttons[i].Text = (i+1).ToString();
    mbuttons[i].ID = "LB" + (i+1).ToString();
    mbuttons[i].Click += new EventHandler(LinkButtonClick);
    Controls.Add(mbuttons[i]);
    Controls.Add(new LiteralControl("&nbsp;&nbsp;"));
    } btnNext = new LinkButton();
    btnNext.ID="NextTen";
    btnNext.Text = "Next 10";
    btnNext.Click += new EventHandler(LinkButtonClick);
    Controls.Add(btnNext);
    Controls.Add(new LiteralControl("&nbsp;&nbsp;"));
    } void LinkButtonClick(Object sender, EventArgs e)
    {
    LinkButton lb = (LinkButton)sender;
    if (lb.ID.EndsWith("Ten"))
    {
    if (lb.ID.StartsWith("Pre"))
    {
    CurrentTab--;
    if (CurrentTab < 0)
    CurrentTab = 0;
    }
    else
    {
    CurrentTab++;
    if (CurrentTab * nPagerCount > mPageCount)
    CurrentTab = mPageCount/nPagerCount;
    } CurrentPage = CurrentTab * nPagerCount;
    }
    else
    CurrentPage = Convert.ToInt32(lb.Text) - 1;
    } protected override void OnPreRender(EventArgs e)
    {
    base.OnPreRender (e); mlbl.Text = "Page " + (CurrentPage+1).ToString();
    int nStart = CurrentPage * PageSize;
    int nEnd = (CurrentPage + 1)* PageSize ;
    if (nEnd >TotalCount)
    nEnd = TotalCount; mtbl.Rows.Clear();
    mtbl.GridLines = GridLines.Both;
    for (int i=nStart; i < nEnd; i++)
    {
    TableRow tr = new TableRow();
    TableCell tc = new TableCell();
    tc.Text = i.ToString();
    tr.Cells.Add(tc);
    mtbl.Rows.Add(tr);
    } btnPrev.Visible = CurrentTab != 0; for (int i= 0 ; i < nPagerCount; i++)
    {
    int nPageNumber = CurrentTab*nPagerCount + i+1;
    mbuttons[i].Text = nPageNumber.ToString();
    mbuttons[i].Enabled = CurrentPage % nPagerCount != i;
    mbuttons[i].Visible = nPageNumber <= mPageCount; } btnNext.Visible = (CurrentTab +1) * nPagerCount  < mPageCount;

    } }
    }
      

  16.   

    为什么i又是=0,是变量!!!!!!!!!!!!!!!!!!!!
    for (int i=0; i < nPagerCount; i++)
    {
    mbuttons[i] = new LinkButton();
    //mbuttons[i].Text = (i+1).ToString();
    mbuttons[i].ID = "LB" + (i+1).ToString();
    mbuttons[i].Click += new EventHandler(LinkButtonClick);
    Controls.Add(mbuttons[i]);
    Controls.Add(new LiteralControl("&nbsp;&nbsp;"));
    }
      

  17.   

    可否给个i的初始值是变量的例子!!
    for (int i=startcount; i < nPagerCount; i++)
    {
    mbuttons[i] = new LinkButton();
    //mbuttons[i].Text = (i+1).ToString();
    mbuttons[i].ID = "LB" + (i+1).ToString();
    mbuttons[i].Click += new EventHandler(LinkButtonClick);
    Controls.Add(mbuttons[i]);
    Controls.Add(new LiteralControl("&nbsp;&nbsp;"));
    }这个变量是用另一个事件控制,比如我点击按钮“下10页”,startcount=10,则linkbutton数组从mbuttons[10]开始!
      

  18.   

    不好意思,刚发现你是在onPreRender中实现了text值再赋值,我怎么没想到,高!