Oct 16
2008

Obwohl mit ASP.NET 3.5 das neue ListView Control und das neue DataPager Control zur Verfügung stehen, ist in vielen bestehenden Webseiten das GridView Control aus ASP.NET 2.0 in Anwendung. Eigentlich ein sehr leistungsfähiges Control, welches von Haus aus schon Unterstützung für Paging und Sorting bietet. Will oder muss man allerdings ein eigenes Paging implementieren, dann sind doch einige Zeilen Code selbst zu schreiben und einige Dinge zu beachten. Zum Thema "Custom Paging" im GridView habe ich im Netz einen interessanten Artikel im Blog von Francisco Santos Jr. gefunden, der allerdings im Detail schwer nachzuvollziehen ist, da einige wichtige Codepassagen fehlen.

Nachfolgend meine Lösung, die auf dem o.g. Blogeintrag basiert, jedoch versucht, dessen Schwachstellen weitestgehend zu beseitigen. Das Paging kann optisch etwa so aussehen:

 

aspx-Code (PagerTemplate für das GridView):

            <PagerTemplate>
                <asp:ImageButton
                    ID="btnFirst" runat="server" ToolTip="zur ersten Seite" ImageUrl="~/img/first.gif" CommandArgument="First" OnCommand="TurnThePage" />
                <asp:ImageButton
                    ID="btnPrevious" runat="server" ToolTip="zur vorherigen Seite" ImageUrl="~/img/previous.gif" CommandArgument="Prev" OnCommand="TurnThePage" />
                    Seite
                <asp:DropDownList
                    ID="ddlPages" runat="server" AutoPostBack="True" OnSelectedIndexChanged="ddlPages_SelectedIndexChanged" />  von
                <asp:Label ID="lblPageCount" runat="server" />

                <asp:ImageButton
                    ID="btnNext" runat="server" ToolTip="zur nächsten Seite" ImageUrl="~/img/next.gif" CommandArgument="Next" OnCommand="TurnThePage" />
                <asp:ImageButton
                    ID="btnLast" runat="server" ToolTip="zur letzten Seite" ImageUrl="~/img/last.gif" CommandArgument="Last" OnCommand="TurnThePage" />
        </PagerTemplate>

  cs-Code:

         /// <summary>
        /// when page is changed by dropdown
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void ddlPages_SelectedIndexChanged(object sender, EventArgs e)
        {
            GridViewRow gvrPager = grdvwCompanies.BottomPagerRow;
            DropDownList ddlPages =(DropDownList)gvrPager.Cells[0].FindControl("ddlPages");

            grdvwCompanies.PageIndex = ddlPages.SelectedIndex;

            // populate gridView
            DoCompanySearch(searchTerm);
        }

        /// <summary>
        /// when page is changed by clicking pager arrows
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void grdvwCompanies_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            GridViewRow gvrPager = grdvwCompanies.BottomPagerRow;
            DropDownList ddlPages =(DropDownList)gvrPager.Cells[0].FindControl("ddlPages");
            grdvwCompanies.PageIndex = ddlPages.SelectedIndex;

            // populate gridView
            DoCompanySearch(searchTerm);
        }

        /// <summary>
        /// method for OnCommand in imagebutton
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void TurnThePage(object sender, CommandEventArgs e)
        {
            // get the current page selected
            int intCurIndex = grdvwCompanies.PageIndex;

            switch (e.CommandArgument.ToString().ToLower())
            {
                case "first":
                    grdvwCompanies.PageIndex = 0;
                    break;
                case "prev":
                    grdvwCompanies.PageIndex = intCurIndex - 1;
                    break;
                case "next":
                    grdvwCompanies.PageIndex = intCurIndex + 1;
                    break;
                case "last":
                    grdvwCompanies.PageIndex = grdvwCompanies.PageCount;
                    break;
            }

            // populate gridView
            DoCompanySearch(searchTerm);
        }

        /// <summary>
        /// event when data are bound to gridview
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void grdvwCompanies_DataBound(object sender, EventArgs e)
        {
            GridViewRow gvrPager = grdvwCompanies.BottomPagerRow;
           
            if (gvrPager == null) return;
            gvrPager.Visible = true;
            // get controls from the gridview
            DropDownList ddlPages = (DropDownList)gvrPager.Cells[0].FindControl("ddlPages");
            Label lblPageCount = (Label)gvrPager.Cells[0].FindControl("lblPageCount");

            if (ddlPages != null)
            {
                // populate pager
                for (int i = 0; i < grdvwCompanies.PageCount; i++)
                {
                    int intPageNumber = i + 1;
                    ListItem lstItem = new ListItem(intPageNumber.ToString());

                    if (i == grdvwCompanies.PageIndex)
                        lstItem.Selected = true;

                    ddlPages.Items.Add(lstItem);
                }
            }

            // populate page count
            if (lblPageCount != null)
                lblPageCount.Text = grdvwCompanies.PageCount.ToString();

            //– For First and Previous ImageButton
            if (grdvwCompanies.PageIndex == 0)
            {
                ((ImageButton)grdvwCompanies.BottomPagerRow.FindControl("btnFirst")).Enabled = false;
                ((ImageButton)grdvwCompanies.BottomPagerRow.FindControl("btnPrevious")).Enabled = false;
            }

            //– For Last and Next ImageButton
            if (grdvwCompanies.PageIndex+1 == grdvwCompanies.PageCount)
            {
                ((ImageButton)grdvwCompanies.BottomPagerRow.FindControl("btnLast")).Enabled = false;
                ((ImageButton)grdvwCompanies.BottomPagerRow.FindControl("btnNext")).Enabled = false;
            }
        }

Tags: Tags: |

Related posts

Comments are closed