博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

简易自定义分页

Posted on 2010-07-19 13:25  火冰·瓶  阅读(184)  评论(0编辑  收藏  举报

本来想写成自定义控件的,觉得麻烦,并且暂时没有太多的时间来弄这个。就偷懒,写了个用户控件将就用。

用户控件的html部分

<div style="text-align: right; height: 20px">
    <table style="display: inline; float: right;">
        <tr>
            <td style="width: 35px">
                <asp:LinkButton ID="BTN_First" runat="server" Text="首页" CommandArgument="First" OnClick="BTN_Pager_Click" />
            </td>
            <td style="width: 35px">
                <asp:LinkButton ID="BTN_Pre" runat="server" Text="上页" CommandArgument="Pre" OnClick="BTN_Pager_Click" />
            </td>
            <td style="width: 35px">
                <asp:LinkButton ID="BTN_Next" runat="server" Text="下页" CommandArgument="Next" OnClick="BTN_Pager_Click" />
            </td>
            <td style="width: 35px">
                <asp:LinkButton ID="BTN_End" runat="server" Text="尾页" CommandArgument="End" OnClick="BTN_Pager_Click" />
            </td>
        </tr>
    </table>
    <div style="float: right; margin-right: 10px;">
        <asp:TextBox ID="TB_GoTo" runat="server" Width="25px"></asp:TextBox>
        <asp:Button ID="BTN_GoTo" runat="server" Text="跳" Height="25px" OnClick="BTN_GoTo_Click" /></div>
    <div style="float: right; margin-right: 10px;">
        当前是第<asp:Literal ID="L_PageIndex" Text="1" runat="server" />/<asp:Literal ID="L_PageCount"
            Text="0" runat="server" />页</div>
    <div style="float: right; margin-right: 10px;">
        共有<asp:Literal ID="L_RecordCount" Text="0" runat="server" />条记录</div>
    <div style="float: right; margin-right: 10px;">
        每页<asp:Literal ID="L_PageSize" Text="10" runat="server" />条记录</div>
</div>

用户控件的后台部分。

定义了一个委托,调用外部根据数据源进行绑定数据的方法,以便在不同的分页应用到不同的场合。

namespace Fireice.Edo.Web.UserControl
{
    public delegate void PagerDataTable(DataTable dt);
    public partial class Pager : System.Web.UI.UserControl
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
                BoundData();

            DIV_Pager.Attributes.Add("style", _style);
            //text-align: right; margin-right:40px; margin-bottom:20px; height: 20px
        }


        public PagerDataTable PagerDataTableHander;

        public string TableName
        {
            get
            {
                if (ViewState["TableName"] == null)
                    throw new Exception("没有指定表名");
                else
                    return ViewState["TableName"].ToString();
            }
            set { ViewState["TableName"] = value; }
        }

        public string OrderField
        {
            get
            {
                if (ViewState["OrderField"] == null)
                    throw new Exception("没有指定排序的字段");
                return ViewState["OrderField"].ToString();
            }
            set { ViewState["OrderField"] = value; }
        }

        public string WherePart
        {
            get { return ViewState["WherePart"] == null ? String.Empty : ViewState["WherePart"].ToString(); }
            set { ViewState["WherePart"] = value; }
        }

        public OrderDirect OrderDirect
        {
            get
            {
                if (ViewState["OrderDirect"] == null)
                    return OrderDirect.ASC;
                return (OrderDirect)Enum.Parse(typeof(OrderDirect), ViewState["OrderDirect"].ToString());
            }
            set { ViewState["OrderDirect"] = value; }
        }

        public DatabaseType DatabaseType
        {
            get
            {
                if (ViewState["DatabaseType"] == null)
                    return DatabaseType.MySql;
                return (DatabaseType)Enum.Parse(typeof(DatabaseType), ViewState["DatabaseType"].ToString());
            }
            set { ViewState["DatabaseType"] = value; }
        }

        private void BoundData()
        {
            string tableName = TableName;
            string orderField = OrderField;
            string orderDirect = OrderDirect.ToString();

            Fireice.Edo.Helper.DB.DBHelper db = new Fireice.Edo.Helper.DB.DBHelper();
            //db.GetDataTable();
            int count = Convert.ToInt32(db.GetSingleFieldBySQL("select count(*) from " + tableName + " " + WherePart + " "));
            RecordCount = count;
            PageCount = AccountPageCount(PageSize, RecordCount);
            string sql = String.Empty;
            switch (DatabaseType)
            {
                case DatabaseType.MySql:
                    sql = " select * from " + tableName + " " + WherePart + " order by " + orderField + " " + orderDirect + " limit " + (PageIndex - 1) * PageSize + "," + PageSize + " ";
                    break;
                case DatabaseType.SqlServer2000:
                    sql = " SELECT TOP " + PageSize + " * FROM " + tableName + " WHERE (" + orderField + " NOT IN (SELECT TOP " + PageSize * (PageIndex - 1) + " " + orderField + " FROM " + tableName + " ORDER BY " + orderField + " " + orderDirect + ")) ORDER BY " + orderField + " " + orderDirect + " ";
                    break;
            }

            DataTable dt = db.GetDataTable(sql);

            if (PagerDataTableHander != null)
                PagerDataTableHander(dt);
            //_gv.DataSource = dt;
            //_gv.DataBind();
        }



        private void ControlState()
        {
            if (PageCount <= 1)
            {
                TB_GoTo.Enabled = false;
                BTN_GoTo.Enabled = false;
            }
            else
            {
                BTN_GoTo.Enabled = true;
            }

            if (PageIndex == 1 || PageIndex == 0)
            {
                BTN_First.Enabled = false;
                BTN_Pre.Enabled = false;
            }
            else
            {
                BTN_First.Enabled = true;
                BTN_Pre.Enabled = true;
            }

            if (PageIndex == PageCount)
            {
                BTN_Next.Enabled = false;
                BTN_End.Enabled = false;
            }
            else
            {
                BTN_Next.Enabled = true;
                BTN_End.Enabled = true;
            }
        }

        protected override void OnPreRender(EventArgs e)
        {
            base.OnPreRender(e);
            ControlState();
        }


        /// <summary>
        /// 每页显示的记录数
        /// </summary>
        public int PageSize
        {
            get { return Convert.ToInt32(L_PageSize.Text); }
            set { L_PageSize.Text = value.ToString(); }
        }

        /// <summary>
        /// 总记录数
        /// </summary>
        public int RecordCount
        {
            get { return Convert.ToInt32(L_RecordCount.Text); }
            set { L_RecordCount.Text = value.ToString(); }
        }

        /// <summary>
        /// 当前是第几页
        /// </summary>
        public int PageIndex
        {
            get { return Convert.ToInt32(L_PageIndex.Text); }
            set { L_PageIndex.Text = value.ToString(); }
        }

        /// <summary>
        /// 总页数
        /// </summary>
        public int PageCount
        {
            get { return Convert.ToInt32(L_PageCount.Text); }
            set { L_PageCount.Text = value.ToString(); }
        }

        /// <summary>
        /// 根据总记录数和每页显示的页数计算出总页数
        /// </summary>
        /// <param name="pageSize"></param>
        /// <param name="recordCount"></param>
        /// <returns></returns>
        private int AccountPageCount(int pageSize, int recordCount)
        {
            if (pageSize == 0 || recordCount == 0)
                return 0;
            else
            {
                if (recordCount % pageSize == 0)
                {
                    return recordCount / pageSize;
                }
                else
                {
                    return recordCount / pageSize + 1;
                }
            }
        }

        protected void BTN_Pager_Click(object sender, EventArgs e)
        {
            string command = ((LinkButton)sender).CommandArgument;
            switch (command)
            {
                case "First":
                    {
                        PageIndex = 1;
                        break;
                    }
                case "Pre":
                    {
                        PageIndex--;
                        break;
                    }
                case "Next":
                    {
                        PageIndex++;
                        break;
                    }
                case "End":
                    {
                        PageIndex = PageCount;
                        break;
                    }
            }
            BoundData();
        }

        protected void BTN_GoTo_Click(object sender, EventArgs e)
        {
            string pageNumber = TB_GoTo.Text;
            int goToPageNumber = 0;
            bool check = true;
            check = Int32.TryParse(pageNumber, out goToPageNumber);
            if (goToPageNumber <= 0 || goToPageNumber > PageCount)
            {
                check = false;
            }
            if (check)
            {
                PageIndex = goToPageNumber;
                BoundData();
            }
            else
            {
                string key = "PagerErrorkey";
                if (!Page.ClientScript.IsStartupScriptRegistered(key))
                {
                    Page.ClientScript.RegisterStartupScript(this.GetType(), key, "alert('输入的跳转页数格式不正确或超出范围!');", true);
                }
            }
        }

        private string _style;
        public string Style
        {
            set { _style = value; }
        }


    }

    public enum OrderDirect
    {
        DESC, ASC
    }



    public enum DatabaseType
    {
        SqlServer2000,
        MySql
    }
}


具体的使用如下:

        protected void Page_Load(object sender, EventArgs e)
        {
            Pager1.TableName = "accessrecord";
            Pager1.OrderDirect = Fireice.Edo.Web.UserControl.OrderDirect.DESC;
            Pager1.OrderField = "Recordtime";
            Pager1.PageSize = 20;
            Pager1.Style = "text-align: right; margin-right:10px; margin-top:10px;margin-bottom:20px; height: 20px";
            Pager1.DatabaseType = Fireice.Edo.Web.UserControl.DatabaseType.MySql;
            Pager1.PagerDataTableHander += new Fireice.Edo.Web.UserControl.PagerDataTable(BoundGV);

        }

        private void BoundGV(DataTable dt)
        {
            GridView1.DataSource = dt;
            GridView1.DataBind();
        }