Click here to Skip to main content
15,896,730 members
Articles / Web Development / ASP.NET

GridView Custom Paging with PageSize Change Dropdown

Rate me:
Please Sign up or sign in to vote.
4.84/5 (29 votes)
5 May 2008CPOL2 min read 230.4K   11.5K   106  
A GridView control with custom paging.
using System;
using System.Data;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Collections;


namespace MrllControlLib
{



    [ToolboxData("<{0}:MrllPager runat=server></{0}:MrllPager>")]
    public class MrllPager : GridView
    {
        private ShowMrllPager _ShowMrllCustomPaging ;
        private DropDownList ddlPager = new DropDownList();
        private DropDownList ddlSort = new DropDownList();
        private DropDownList ddlNumberOfPages = new DropDownList();
        private LinkButton lnkPrev =new LinkButton();
        private LinkButton lnkNext = new LinkButton();
        private string _CustomPagerCssClass =string.Empty;
        private string _DefaultSortExpression = string.Empty;

        private DropDownList ddlFooterPager = new DropDownList();
        private LinkButton lnkFooterPrev = new LinkButton();
        private LinkButton lnkFooterNext = new LinkButton();

        private Label lblStatus = new Label();
        private Label lbkFooterStatus = new Label();

        public delegate void PageSizeChangeHandler(object s, PageSizeChangeEventArgs e);
        public event PageSizeChangeHandler OnPageSizeChanged  ;

        public ShowMrllPager ShowMrllCustomPaging
        {
            get { return _ShowMrllCustomPaging; }
            set { _ShowMrllCustomPaging = value; }
        }
        public string DefaultSortExpression
        {
            get { return _DefaultSortExpression; }
        }
        public string CustomPagerCssClass
        {
            get { return _CustomPagerCssClass; }
            set { _CustomPagerCssClass = value; }
        }
        
        
        protected override void OnInit(EventArgs e)
        {
            if (ShowMrllCustomPaging == ShowMrllPager.OnTopAndBottom)
                base.ShowFooter = true;
            if (ShowMrllCustomPaging != ShowMrllPager.None)
            {
                base.PagerSettings.Position = PagerPosition.Top;
                base.AllowPaging = true;
            }

            ddlNumberOfPages.AutoPostBack = true;
            ddlPager.AutoPostBack = true;
            ddlFooterPager.AutoPostBack = true;
            ddlSort.AutoPostBack = true;
            
            ddlPager.SelectedIndexChanged += new EventHandler(ddlPager_SelectedIndexChanged);
            ddlFooterPager.SelectedIndexChanged += new EventHandler(ddlFooterPager_SelectedIndexChanged);
            ddlSort.SelectedIndexChanged += new EventHandler(ddlSort_SelectedIndexChanged);
            ddlNumberOfPages.SelectedIndexChanged +=new EventHandler(ddlNumberOfPages_SelectedIndexChanged);
            
            lnkNext.Click += new EventHandler(lnkNext_Click);
            lnkPrev.Click += new EventHandler(lnkPrev_Click);

            lnkFooterNext.Click += new EventHandler(lnkNext_Click);
            lnkFooterPrev.Click += new EventHandler(lnkPrev_Click);

            for (int i = 10; i <= 100; i += 10)
            ddlNumberOfPages.Items.Add(i.ToString());
            PageSize=Convert.ToInt32( ddlNumberOfPages.SelectedItem.Value);

            ddlSort.ID = "ddlSort";
            if (ddlSort.Items.Count == 0 && this.AllowSorting)
            {
                //ddlSort.Items.Add("Select");
                for (int i = 0; i < base.Columns.Count; i++)
                    if (base.Columns[i].SortExpression != string.Empty && ddlSort.Items.FindByValue(base.Columns[i].SortExpression) == null)
                        ddlSort.Items.Add(base.Columns[i].SortExpression);
            }
            if (ddlSort.Items.Count > 0)
                _DefaultSortExpression = ddlSort.Items[0].Text;
           
            base.OnInit(e);
        }

 
        protected override void OnRowCreated(GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.Header)
            {
                if (PageCount ==1)
                {
                    this.ShowFooter = false;
                    int iColSpan =e.Row.Cells.Count;
                    
                    Table oTab = new Table();
                    //oTab.BorderWidth = Unit.Pixel(1);
                    oTab.Width = Unit.Percentage(100);
                    TableRow oRow = new TableRow();
                    oTab.Rows.Add(oRow);
                    TableCell oCell = new TableCell();
                    oRow.Cells.Add(oCell);
                    oCell.ColumnSpan = e.Row.Cells.Count;

                    //Add Lable PageSize and Sort Here..
                    Table oInnerTable = new Table();
                    oInnerTable.Rows.Add(new TableRow());
                    TableCell oCellInner = new TableCell();

                    #region "Lable "
                    //Lable...............
                    int iTotalRec = 0;
                    int iUpto = 0;
                    int iStart = PageIndex * PageSize + 1;
                    if (base.DataSource is IListSource)
                    {
                        IListSource itotal = (IListSource)base.DataSource;
                        iTotalRec = itotal.GetList().Count;
                    }
                    else if (base.DataSource is ICollection)
                    {
                        ICollection itotal = (ICollection)base.DataSource;
                        iTotalRec = itotal.Count;
                    }
                    if ((PageIndex + 1) == PageCount)
                        iUpto = iTotalRec;
                    else
                        iUpto = iStart + PageSize - 1;
                    lblStatus.Text = string.Format("Showing {0}-{1} of {2}", iStart, iUpto, iTotalRec);
                    oCellInner.HorizontalAlign = HorizontalAlign.Left;
                    oCellInner.Controls.Add(lblStatus);
                    oCellInner.Width = Unit.Percentage(80);
                    oInnerTable.Rows[0].Cells.Add(oCellInner);
                    #endregion
                    oCellInner = new TableCell();
                    oCellInner.Wrap = false;
                    oCellInner.Text = "Items Per Page ";
                    oInnerTable.Rows[0].Cells.Add(oCellInner);

                    oCellInner = new TableCell();
                    oCellInner.Controls.Add(ddlNumberOfPages);
                    oInnerTable.Rows[0].Cells.Add(oCellInner);

                    if (this.AllowSorting == true)
                    {
                        oCellInner = new TableCell();
                        oCellInner.Wrap = false;
                        oCellInner.Text = "Sort";
                        oInnerTable.Rows[0].Cells.Add(oCellInner);
                        oCell.Controls.Add(oInnerTable);

                        oCellInner = new TableCell();
                        oCellInner.Controls.Add(ddlSort);
                        oInnerTable.Rows[0].Cells.Add(oCellInner);
                    }
                    if (this.CustomPagerCssClass != string.Empty)
                        oInnerTable.CssClass = this.CustomPagerCssClass;
                     
                    GridViewRow PagerRow = base.CreateRow(-1, -1, DataControlRowType.Pager, DataControlRowState.Normal);

                    if ( this.CustomPagerCssClass != string.Empty)
                        PagerRow.CssClass = this.CustomPagerCssClass;
                   
                    PagerRow.Cells.Add(new TableCell());
                    PagerRow.Cells[0].Controls.Add(oTab);  
                    PagerRow.Cells[0].ColumnSpan = this.Columns.Count;
                    Table oNewTab = new Table();
                    if (this.CustomPagerCssClass != string.Empty)
                        PagerRow.CssClass = this.CustomPagerCssClass;
                    oNewTab.Rows.Add(PagerRow);

                                       
                    ((Table)this.Controls[0]).GridLines = this.GridLines;
                    ((Table)this.Controls[0]).BorderWidth = this.BorderWidth;
                    ((Table)this.Controls[0]).CellSpacing = this.CellSpacing;
                    ((Table)this.Controls[0]).BorderStyle = this.BorderStyle;  
                    ((Table)this.Controls[0]).Width = Unit.Percentage(100);
                    if (this.HeaderStyle.CssClass != string.Empty)
                        e.Row.CssClass = this.HeaderStyle.CssClass;

                    
                    Table grid = (Table)this.Controls[0];
                    grid.Rows.AddAt(0, PagerRow);

                                       
                }
                else 
                    this.ShowFooter = true;
            }
            else if (e.Row.RowType == DataControlRowType.Footer)
            {
                if (PageCount > 1)
                {

                    ddlFooterPager.ID = "ddlFooterPager";
                    for (int i = 1; i <= PageCount; i++)
                        if (ddlFooterPager.Items.FindByValue(i.ToString()) == null)
                            ddlFooterPager.Items.Add(new ListItem(i.ToString()));

                    e.Row.Cells[0].Controls.Clear();

                    Table oTab = new Table();
                    TableRow oRow = new TableRow();
                    oTab.Rows.Add(oRow);

                    lnkFooterPrev.Text = "Prev";

                    if (PageIndex == 0)
                        lnkFooterPrev.Enabled = false;
                    else
                        lnkFooterPrev.Enabled = true;
                    TableCell oCell = new TableCell();
                    oCell.Controls.Add(lnkFooterPrev);
                    oRow.Cells.Add(oCell);

                    oCell = new TableCell();

                    oCell.Controls.Add(ddlFooterPager);
                    oRow.Cells.Add(oCell);

                    //lnkNext = new LinkButton();
                    lnkFooterNext.Text = "Next";

                    if (PageCount == PageIndex + 1)
                        lnkFooterNext.Enabled = false;
                    else
                        lnkFooterNext.Enabled = true;

                    oCell = new TableCell();
                    oCell.Controls.Add(lnkFooterNext);
                    oRow.Cells.Add(oCell);
                    int colspan = e.Row.Cells.Count;
                    for (int i = 0; i < colspan-1; i++)
                    {
                        e.Row.Cells.RemoveAt(0);
                    }
                    e.Row.Cells[0].ColumnSpan = colspan;
                    
                    Table oOutertab = new Table();
                    oOutertab.Width = Unit.Percentage(100);
                    if (CustomPagerCssClass != string.Empty)
                    {
                        oTab.CssClass = CustomPagerCssClass;
                        oOutertab.CssClass = CustomPagerCssClass;
                    }
                    TableRow oOuterRow = new TableRow();
                    oOutertab.Rows.Add(oOuterRow);

                    //Lable...............
                    int iTotalRec = 0;
                    int iUpto = 0;
                    int iStart = PageIndex * PageSize + 1;
                    if (base.DataSource is IListSource)
                    {
                        IListSource itotal = (IListSource)base.DataSource;
                        iTotalRec = itotal.GetList().Count;
                    }
                    else if (base.DataSource is ICollection)
                    {
                        ICollection itotal = (ICollection)base.DataSource;
                        iTotalRec = itotal.Count;
                    }
                    if ((PageIndex + 1) == PageCount)
                        iUpto = iTotalRec;
                    else
                        iUpto = iStart + PageSize - 1;
                    lbkFooterStatus.Text = string.Format("Showing {0}-{1} of {2}", iStart, iUpto, iTotalRec);
                    oCell = new TableCell();
                    oCell.HorizontalAlign = HorizontalAlign.Left;
                    oCell.Controls.Add(lbkFooterStatus);
                    oOuterRow.Cells.Add(oCell);
                    //Lable End
                    oCell = new TableCell();
                    oCell.HorizontalAlign = HorizontalAlign.Right;
                    oCell.Controls.Add(oTab);
                    oOuterRow.Cells.Add(oCell);

                    e.Row.Cells[0].Controls.Add(oOutertab);
               }
              base.TopPagerRow.Visible = true;
            }
            else if (e.Row.RowType == DataControlRowType.Pager)
            {
               
                    //DropDownList ddlPager = new DropDownList();
                    ddlPager.ID = "ddlPager";
                    for (int i = 1; i <= PageCount; i++)
                        if (ddlPager.Items.FindByValue(i.ToString()) == null)
                            ddlPager.Items.Add(new ListItem(i.ToString()));

                    if (ShowMrllCustomPaging != ShowMrllPager.None)
                    {
                        e.Row.Cells[0].Controls.Clear();

                        Table oTab = new Table();
                        TableRow oRow = new TableRow();
                        oTab.Rows.Add(oRow);

                        TableCell oCell;
                        if (ddlSort.Items.Count > 1 && this.AllowSorting==true)
                        {
                            oCell = new TableCell();
                            oCell.Text = "Sort";
                            oRow.Cells.Add(oCell);


                            oCell = new TableCell();
                            oCell.Controls.Add(ddlSort);
                            oRow.Cells.Add(oCell);
                        }
                        

                        oCell = new TableCell();
                        oCell.Text = "Items Per Page";
                        oRow.Cells.Add(oCell);

                        oCell = new TableCell();
                        oCell.Controls.Add(ddlNumberOfPages);
                        oRow.Cells.Add(oCell);

                        //lnkPrev = new LinkButton();
                        lnkPrev.Text = "Prev";
                        
                        if (PageIndex == 0)
                            lnkPrev.Enabled = false;
                        else
                            lnkPrev.Enabled = true;
                        oCell = new TableCell();
                        oCell.Controls.Add(lnkPrev);
                        oRow.Cells.Add(oCell);

                        oCell = new TableCell();

                        oCell.Controls.Add(ddlPager);
                        oRow.Cells.Add(oCell);

                        //lnkNext = new LinkButton();
                        lnkNext.Text = "Next";
                        lnkNext.CommandName = "page";
                        lnkNext.CommandArgument = (PageIndex + 1).ToString();
                        if (PageCount == PageIndex + 1)
                            lnkNext.Enabled = false;
                        else
                            lnkNext.Enabled = true;
                        
                        oCell = new TableCell();
                        oCell.Controls.Add(lnkNext);
                        oRow.Cells.Add(oCell);
                        e.Row.Cells[0].HorizontalAlign = HorizontalAlign.Right;

                        Table oOutertab = new Table();
                        oOutertab.Width = Unit.Percentage(100);
                        if (CustomPagerCssClass != string.Empty)
                        {
                            oTab.CssClass = CustomPagerCssClass;
                            oOutertab.CssClass = CustomPagerCssClass;
                        }
                        TableRow oOuterRow = new TableRow();
                        oOutertab.Rows.Add(oOuterRow);
                        //Lable
                        int iTotalRec = 0;
                        int iUpto = 0;
                        int iStart = PageIndex * PageSize + 1;
                        if (base.DataSource is IListSource)
                        {
                            IListSource itotal = (IListSource)base.DataSource;
                            iTotalRec = itotal.GetList().Count;
                        }
                        else if (base.DataSource is ICollection)
                        {
                            ICollection itotal = (ICollection)base.DataSource;
                            iTotalRec = itotal.Count;
                        }
                        if ((PageIndex + 1) == PageCount)
                            iUpto = iTotalRec;
                        else
                            iUpto = iStart + PageSize - 1;
                        lblStatus.Text = string.Format("Showing {0}-{1} of {2}", iStart, iUpto, iTotalRec);
                        oCell = new TableCell();
                        oCell.HorizontalAlign = HorizontalAlign.Left;
                        oCell.Controls.Add(lblStatus);
                        oOuterRow.Cells.Add(oCell);
                        //Lable End
                        
                        oCell = new TableCell();
                        oCell.HorizontalAlign = HorizontalAlign.Right;
                        oCell.Controls.Add(oTab);
                        oOuterRow.Cells.Add(oCell);
                        e.Row.Cells[0].Controls.Add(oOutertab);

                    }
                 
            }
            //base.OnRowCreated(e);
        }

       

        protected void lnkNext_Click(object sender, System.EventArgs e)
        {
            //DropDownList ddlPager = (DropDownList)sender;
            int PageID = Convert.ToInt32(ddlPager.SelectedItem.Value);
            ddlPager.SelectedIndexChanged -= new EventHandler(ddlPager_SelectedIndexChanged);
            
            ddlPager.SelectedValue = (PageID + 1).ToString();
            
            ddlPager.SelectedIndexChanged += new EventHandler(ddlPager_SelectedIndexChanged);
            
            if (ShowMrllCustomPaging == ShowMrllPager.OnTopAndBottom) 
            {
                ddlFooterPager.SelectedIndexChanged -= new EventHandler(ddlPager_SelectedIndexChanged);
                ddlFooterPager.SelectedValue = (PageID + 1).ToString();
                ddlFooterPager.SelectedIndexChanged += new EventHandler(ddlPager_SelectedIndexChanged);
            }
            base.OnPageIndexChanging(new GridViewPageEventArgs(PageIndex+1));
        }

        protected void lnkPrev_Click(object sender, System.EventArgs e)
        {
            //DropDownList ddlPager = (DropDownList)sender;
            int PageID = Convert.ToInt32(ddlPager.SelectedItem.Value);
            
            ddlPager.SelectedIndexChanged -= new EventHandler(ddlPager_SelectedIndexChanged);
            ddlPager.SelectedValue = (PageID - 1).ToString();
            ddlPager.SelectedIndexChanged += new EventHandler(ddlPager_SelectedIndexChanged);
           
            if (ShowMrllCustomPaging == ShowMrllPager.OnTopAndBottom)
            {
                ddlFooterPager.SelectedIndexChanged -= new EventHandler(ddlPager_SelectedIndexChanged);
                ddlFooterPager.SelectedValue = (PageID - 1).ToString();
                ddlFooterPager.SelectedIndexChanged += new EventHandler(ddlPager_SelectedIndexChanged);
            }
            base.OnPageIndexChanging(new GridViewPageEventArgs(PageIndex -1));

        }

        protected void ddlPager_SelectedIndexChanged(object sender, System.EventArgs e)
        {
            DropDownList ddlPager = (DropDownList)sender;
            int PageID = Convert.ToInt32(ddlPager.SelectedItem.Value);
            PageID = PageID - 1;
            ddlFooterPager.SelectedIndexChanged -= new EventHandler(ddlFooterPager_SelectedIndexChanged);
            ddlFooterPager.SelectedValue = ddlPager.SelectedItem.Value;
            ddlFooterPager.SelectedIndexChanged += new EventHandler(ddlFooterPager_SelectedIndexChanged);
            base.OnPageIndexChanging(new GridViewPageEventArgs(PageID));
        }

        protected void ddlFooterPager_SelectedIndexChanged(object sender, System.EventArgs e)
        {
            DropDownList ddlFooterPager = (DropDownList)sender;
            int PageID = Convert.ToInt32(ddlFooterPager.SelectedItem.Value);
            PageID = PageID - 1;
            ddlPager.SelectedIndexChanged -= new EventHandler(ddlPager_SelectedIndexChanged);
            ddlPager.SelectedValue = ddlFooterPager.SelectedItem.Value;
            ddlPager.SelectedIndexChanged += new EventHandler(ddlPager_SelectedIndexChanged);
            
            base.OnPageIndexChanging(new GridViewPageEventArgs(PageID));
        }

        protected void ddlSort_SelectedIndexChanged(object sender, System.EventArgs e)
        {
            DropDownList ddlSort = (DropDownList)sender;
            base.OnSorting(new GridViewSortEventArgs(ddlSort.SelectedItem.Value,SortDirection.Ascending));
        }

        protected void ddlNumberOfPages_SelectedIndexChanged(object sender, System.EventArgs e)
        {
            int iPageSize = Convert.ToInt32(ddlNumberOfPages.SelectedItem.Value);
            //base.PageSize = iPageSize;
            PageIndex = 0;
            ddlPager.SelectedIndexChanged -= new EventHandler(ddlPager_SelectedIndexChanged);
            ddlPager.Items.Clear(); 
            ddlPager.SelectedIndexChanged += new EventHandler(ddlPager_SelectedIndexChanged);

            ddlFooterPager.SelectedIndexChanged -= new EventHandler(ddlFooterPager_SelectedIndexChanged);
            ddlFooterPager.Items.Clear(); 
            ddlFooterPager.SelectedIndexChanged += new EventHandler(ddlFooterPager_SelectedIndexChanged);

            //ddlSort.SelectedIndexChanged -= new EventHandler(ddlSort_SelectedIndexChanged);
            //ddlSort.Items.Clear();
            //ddlSort.SelectedIndexChanged += new EventHandler(ddlSort_SelectedIndexChanged);

            OnPageSizeChanged(this, new PageSizeChangeEventArgs(iPageSize));
        }
    }

    public enum ShowMrllPager
    {
        None,
        OnTop,
        OnBotton,
        OnTopAndBottom
    }

    public class PageSizeChangeEventArgs : System.EventArgs
    {
        public int NewPageSize;
        public PageSizeChangeEventArgs(int pNewPageSize)
        {
            NewPageSize = pNewPageSize;
        }
    }
}

 

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
India India
I have done Master Degree in Computers and MCAD and working on Microsoft technologie since last 4 yrs. Currently working with TCS (India).

Comments and Discussions