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; /**////<summary> /// Control that displays a list of page numbers based on the selected page, /// number of displayed pages, and the count of pages ///</summary> namespace ClubSite { publicclass PageNumberer : WebControl, IPostBackEventHandler { privateint m_SelectedPage, m_Count, m_displayedPages; public PageNumberer() { //No constructor logic. } publicint SelectedPage { get { if (m_SelectedPage ==0) { object o = ViewState["SelectedPage"]; m_SelectedPage = (o !=null) ? (int)o : 1; } return m_SelectedPage; } set { ViewState["SelectedPage"] = value; m_SelectedPage = value; } } publicint Count { get { if (m_Count ==0) { object o = ViewState["Count"]; m_Count = (o !=null) ? (int)o : 1; } return m_Count; } set { ViewState["Count"] = value; m_Count = value; } } publicint DisplayedPages { get { if (m_displayedPages ==0) { object o = ViewState["DisplayedPages"]; m_displayedPages = (o !=null) ? (int)o : 1; } return m_displayedPages; } set { ViewState["DisplayedPages"] = value; m_displayedPages = value; } } protectedoverride HtmlTextWriterTag TagKey { get { return HtmlTextWriterTag.Div; // uncomment for a table // return HtmlTextWriterTag.Table; } } protectedoverridevoid RenderContents(HtmlTextWriter writer) { int prevListCount, nextListCount, startPage, endPage; prevListCount = Math.Abs((m_displayedPages -1) /2); if (m_SelectedPage <= prevListCount) prevListCount = m_SelectedPage -1; nextListCount = m_displayedPages - prevListCount -1; if (m_SelectedPage + nextListCount > m_Count) nextListCount = m_Count - m_SelectedPage; startPage = m_SelectedPage - prevListCount; endPage = m_SelectedPage + nextListCount; // uncomment for a table // writer.RenderBeginTag(HtmlTextWriterTag.Tr); if (startPage >1) { renderItem(writer, "« First", 1); } if (SelectedPage >1) { renderItem(writer, "< Prev", SelectedPage -1); } for (int count = startPage; count <= endPage; count++) { string label; if (count != endPage) label = count.ToString() +","; else label = count.ToString(); if (count == m_SelectedPage) { renderItem(writer, label, 0); } else { renderItem(writer, label, count); } } if (SelectedPage < m_Count) { renderItem(writer, "Next >", SelectedPage +1); } if (endPage < m_Count) { renderItem(writer, "Last »", m_Count); } } void renderItem(HtmlTextWriter writer, string text, int pageNum) { writer.RenderBeginTag(HtmlTextWriterTag.Span); if (pageNum!=0) { writer.AddAttribute(HtmlTextWriterAttribute.Href, Page.ClientScript.GetPostBackClientHyperlink(this,pageNum.ToString())); writer.RenderBeginTag(HtmlTextWriterTag.A); } writer.Write(text); if (pageNum!=0) { writer.RenderEndTag(); } writer.RenderEndTag(); } privatestaticreadonlyobject EventSelectedPageChanged =null; publicevent EventHandler SelectedPageChanged { add { Events.AddHandler(EventSelectedPageChanged,value); } remove { Events.RemoveHandler(EventSelectedPageChanged, value); } } void IPostBackEventHandler.RaisePostBackEvent(string eventArgument) { int newPage; if (int.TryParse(eventArgument, out newPage)) { this.SelectedPage = newPage; OnSelectedPageChanged(EventArgs.Empty); } } protectedvirtualvoid OnSelectedPageChanged(EventArgs e) { EventHandler changehandler = (EventHandler)Events[EventSelectedPageChanged]; if (changehandler !=null) { changehandler(this, e); } } } }
存储过程:
ALTERPROCEDURE PagedAnnouncementList ( @pageNumINT=1, @pageSizeINT=10 ) AS DECLARE@rowsINT DECLARE@keydateDATETIME DECLARE@keyidINT DECLARE@rowCountFLOAT/**//* yes we need a float for the math */ IF@pageNum=1 BEGIN SET@keydate=0 SET@keyid=0 END ELSE BEGIN /**//* get the values for the date and row */ SELECT@rows= (@pageNum-1) *@pageSize SETROWCOUNT@rows SELECT@keydate=itemdate, @keyid=id FROM announcements ORDERBY itemdate ASC, id ASC END SELECT@rowCount=COUNT(*) FROM announcements SETROWCOUNT@pageSize SELECT id, itemdate, title, description, photo FROM Announcements WHERE (itemdate >@keydateOR (itemdate =@keydate) AND (id >@keyid)) ORDERBY itemdate ASC, id ASC RETURNCEILING(@rowCount/@pageSize)