[转帖]DataGrid的自定义分页UserControl

类别:.NET开发 点击:0 评论:0 推荐:
PageChange.ascx
================================================================
<%@ Control Language="c#" AutoEventWireup="false" Codebehind="PageChange.ascx.cs" Inherits="Ex_Test.PageChange" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%>
<FONT face="宋体">
    <TABLE id="Table1" cellSpacing="1" cellPadding="1" width="98%" border="0">
        <TR>
            <TD align="right"><asp:linkbutton id="FirstPage" runat="server">[首 页]</asp:linkbutton>&nbsp;
                <asp:linkbutton id="PrevPage" runat="server">[上一页]</asp:linkbutton>&nbsp;
                <asp:linkbutton id="NextPage" runat="server">[下一页]</asp:linkbutton>&nbsp;
                <asp:linkbutton id="LastPage" runat="server">[末 页]</asp:linkbutton>&nbsp;
                <asp:literal id="Literal1" runat="server" Text="转到第"></asp:literal><asp:textbox id="NewPageIndex" runat="server" Width="31px"></asp:textbox><asp:literal id="Literal2" runat="server" Text="页"></asp:literal>&nbsp;
                <asp:button id="NewPageGo" runat="server" Text="Go"></asp:button>&nbsp;</TD>
        </TR>
    </TABLE>
</FONT>
=======================================================================


PageChange.ascx.cs
===================================================================
namespace Ex_Test
{
    using System;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    using System.Data.SqlClient;

    /// <summary>
    ///        PageChange 的摘要说明。
    /// </summary>
    public abstract class PageChange : System.Web.UI.UserControl
    {
        protected System.Web.UI.WebControls.Button NewPageGo;
        protected System.Web.UI.WebControls.Literal Literal2;
        protected System.Web.UI.WebControls.TextBox NewPageIndex;
        protected System.Web.UI.WebControls.Literal Literal1;
        protected System.Web.UI.WebControls.LinkButton LastPage;
        protected System.Web.UI.WebControls.LinkButton NextPage;
        protected System.Web.UI.WebControls.LinkButton PrevPage;
        protected System.Web.UI.WebControls.LinkButton FirstPage;
        protected int currentpage;
        protected int pagesize;
        protected string proc;
        protected System.Web.UI.WebControls.DataGrid datagrid;


        public int _CurrentPage
        {
            get
            {
                return currentpage;
            }
            set
            {
                currentpage = value;
            }
        }

        public int _pageSize
        {
            get
            {
                return pagesize;
            }
            set
            {
                pagesize = value;
            }
        }

        public string _proc
        {
            get
            {
                return proc;
            }
            set
            {
                proc = value;
            }
        }

        public DataGrid _datagrid
        {
            get
            {
                return datagrid;
            }
            set
            {
                datagrid = value;
            }
        }

        protected int rowcount;
        private void Page_Load(object sender, System.EventArgs e)
        {
            // 在此处放置用户代码以初始化页面
            if(!IsPostBack)
            {
                using(SqlConnection conn = new SqlConnection("User id=sa;password=admin;server=server-mk;initial catalog=pubs;timeout=90")
                {
                    SqlCommand cmd = new SqlCommand("select count(*) as expr1 from authors",conn);
                    cmd.Connection.Open();
                    rowcount = (int)cmd.ExecuteScalar();
                    cmd.Connection.Close();
                    ViewState["rowscount"] = rowcount;
                }
                ViewState["currentpage"] = currentpage;
                FillGrid(proc,currentpage,pagesize,datagrid);
            }
        }

        #region Web Form Designer generated code
        override protected void OnInit(EventArgs e)
        {
            //
            // CODEGEN:该调用是 ASP.NET Web 窗体设计器所必需的。
            //
            InitializeComponent();
            base.OnInit(e);
        }
        
        ///        设计器支持所需的方法 - 不要使用
        ///        代码编辑器修改此方法的内容。
        /// </summary>
        private void InitializeComponent()
        {
            this.FirstPage.Click += new System.EventHandler(this.FirstPage_Click);
            this.PrevPage.Click += new System.EventHandler(this.PrevPage_Click);
            this.NextPage.Click += new System.EventHandler(this.NextPage_Click);
            this.LastPage.Click += new System.EventHandler(this.LastPage_Click);
            this.NewPageGo.Click += new System.EventHandler(this.NewPageGo_Click);
            this.Load += new System.EventHandler(this.Page_Load);

        }
        #endregion

        private void FillGrid(string proc,int currentpage,int pagesize,DataGrid datagrid)
        {
            using(SqlConnection conn = new SqlConnection("User id=sa;password=admin;server=server-mk;initial catalog=pubs;timeout=90")
            {
                SqlCommand cmd = new SqlCommand(proc,conn);
cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add("@CurrentPage",currentpage);
                cmd.Parameters.Add("@PageSize",pagesize);
                cmd.Connection.Open();

                SqlDataReader sdr = cmd.ExecuteReader();
datagrid.DataSource = sdr;
                datagrid.DataBind();
                sdr.Close();
                cmd.Connection.Close();
            }
        }

        //首页
        private void FirstPage_Click(object sender, System.EventArgs e)
        {
            //disabled首页按钮和上一页按钮
            FirstPage.Enabled = false;
            PrevPage.Enabled = false;    
            currentpage = 0;
         ViewState["currentpage"] = currentpage;
            FillGrid(proc,currentpage,pagesize,datagrid);
            //如果不止一页
            if((int)ViewState["rowscount"]>((int)ViewState["currentpage"]+1)*pagesize)
            {
                NextPage.Enabled = true;
            }
            if((int)ViewState["rowscount"]>((int)ViewState["currentpage"]+1)*pagesize)
            {
                LastPage.Enabled = true;
            }
        }

        //上一页
        private void PrevPage_Click(object sender, System.EventArgs e)
        {

            NextPage.Enabled = true;
            LastPage.Enabled = true;
         currentpage = (int)ViewState["currentpage"]-1;
            ViewState["currentpage"] = currentpage;
            FillGrid(proc,currentpage,pagesize,datagrid);    
            //如果到首页则disabled首页和上一页按钮
            if((int)ViewState["currentpage"]==0)
            {
                PrevPage.Enabled = false;
                FirstPage.Enabled = false;
                //return;
            }
        }

        //下一页
        private void NextPage_Click(object sender, System.EventArgs e)
        {
            ViewState["currentpage"] = (int)ViewState["currentpage"]+1;
            currentpage = (int)ViewState["currentpage"];
            FillGrid(proc,currentpage,pagesize,datagrid);
            PrevPage.Enabled = true;
            FirstPage.Enabled = true;
            //如果已经到了最后一页
            if(((int)ViewState["currentpage"]+1)*pagesize>(int)ViewState["rowscount"])
            {
                NextPage.Enabled = false;
                LastPage.Enabled = false;
            }
        }

        //末页
        private void LastPage_Click(object sender, System.EventArgs e)
        {
            LastPage.Enabled = false;
         NextPage.Enabled = false;
            ViewState["currentpage"] = (int)Math.Ceiling((int)ViewState["rowscount"]/pagesize);
            currentpage = (int)ViewState["currentpage"];
            FillGrid(proc,currentpage,pagesize,datagrid);
            //如果有不止一页的纪录
            if((int)ViewState["currentpage"]>1)
            {
                FirstPage.Enabled = true;
                PrevPage.Enabled = true;
            }
                //如果只有一页的纪录
            else
            {
FirstPage.Enabled = false;
                PrevPage.Enabled = false;
            }
        }

        //跳转
        private void NewPage_Go(string i)
        {
            try
            {
                int PageIndex = Int32.Parse(i);
                if (PageIndex<=0)
                {
                    PageIndex = 0;
                }
                else
                {
                    if(PageIndex>(int)Math.Ceiling((int)ViewState["rowscount"]/pagesize))
                    {
                        PageIndex = (int)Math.Ceiling((int)ViewState["rowscount"]/pagesize);
                    }
                    else
                    {
                        PageIndex--;
                    }
                }
                //简单起见,将所有的linkbutton全部改为enable=true
                FirstPage.Enabled = true;
                NextPage.Enabled = true;
                LastPage.Enabled = true;
                PrevPage.Enabled = true;
                ViewState["currentpage"] = PageIndex;
                FillGrid(proc,(int)ViewState["currentpage"],pagesize,datagrid);
            }
            catch(Exception)
            {
                return;
            }
        }

        private void NewPageGo_Click(object sender, System.EventArgs e)
        {
         NewPage_Go(NewPageIndex.Text.Trim());
        }

    }
}

PageForm.aspx
==================================================================
<%@ Page language="c#" Codebehind="PageForm.aspx.cs" AutoEventWireup="false" Inherits="Ex_Test.PageForm" %>
<%@ Register TagPrefix="MK" TagName="PageChange" src="PageChange.ascx"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
    <HEAD>
        <title>PageForm</title>
        <meta name="GENERATOR" Content="Microsoft Visual Studio 7.0">
        <meta name="CODE_LANGUAGE" Content="C#">
        <meta name="vs_defaultClientScript" content="JavaScript">
        <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
    </HEAD>
    <body MS_POSITIONING="GridLayout">
        <form id="PageForm" method="post" runat="server">
            <aspataGrid id="DataGrid1" style="Z-INDEX: 101; LEFT: 57px; POSITION: absolute; TOP: 54px" runat="server" AllowCustomPaging="True" AllowPaging="True">
                <PagerStyle Visible="False"></PagerStyle>
            </aspataGrid>
            <aspanel id="Panel1" style="Z-INDEX: 102; LEFT: 60px; POSITION: absolute; TOP: 20px" runat="server" Width="634px">
                <MKageChange id="pc" runat="server"></MKageChange>
            </aspanel><FONT face="宋体"></FONT>
        </form>
    </body>
</HTML>
=================================================================

PageForm.aspx.cs
=================================================================
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace Ex_Test
{
    /// <summary>
    /// PageForm 的摘要说明。
    /// </summary>
    public class PageForm : System.Web.UI.Page
    {
        protected System.Web.UI.WebControls.DataGrid DataGrid1;
        protected System.Web.UI.WebControls.Panel Panel1;
        protected Ex_Test.PageChange pc;
        
    
        private void Page_Load(object sender, System.EventArgs e)
        {
            // 在此处放置用户代码以初始化页面
            //if(!IsPostBack)
            //{
                pc._CurrentPage = 0;
                pc._datagrid = DataGrid1;
                pc._pageSize =7;
                pc._proc = "Page_Change";
            //}
        }

        #region Web Form Designer generated code
        override protected void OnInit(EventArgs e)
        {
            //
            // CODEGEN:该调用是 ASP.NET Web 窗体设计器所必需的。
            //
            InitializeComponent();
            base.OnInit(e);
        }
        
        /// <summary>
        /// 设计器支持所需的方法 - 不要使用代码编辑器修改
        /// 此方法的内容。
        /// </summary>
        private void InitializeComponent()
        {
            this.Load += new System.EventHandler(this.Page_Load);

        }
        #endregion
    }

}
=================================================================
存储过程:
Create PROCEDURE dbo.Page_Change
/*
    (
        @parameter1 datatype = default value,
        @parameter2 datatype OUTPUT
    )
*/
(
@PageSize int,
@CurrentPage int
)

AS
    /* SET NOCOUNT ON */
    
    select *,IDENTITY(int,1,1) as Num into #TempAuthors from Authors
    
    select * from #TempAuthors where Num > (@PageSize*@CurrentPage) and Num < (@PageSize*@CurrentPage+@PageSize+1)
    
    RETURN

本文地址:http://com.8s8s.com/it/it43126.htm