DataGrid连接Access的快速分页法(5)——实现快速分页

原创 2004年03月08日 11:25:00
DataGrid连接Access的快速分页法(5)——实现快速分页
 
     我使用Access自带的Northwind中文数据库的“订单明细”表作为例子,不过我在该表添加了一个名为“Id”的字段,数据类型为“自动编号”,并把该表命名为“订单明细表”。
 
FastPaging_DataSet.aspx
--------------------------------------------------------------------------------------
<%@ Page language="c#" Codebehind="FastPaging_DataSet.aspx.cs" AutoEventWireup="false" Inherits="Paging.FastPaging_DataSet" EnableSessionState="False" enableViewState="True" enableViewStateMac="False" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
       <HEAD>
              <title>DataGrid + DataReader 自定义分页</title>
              <meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">
              <meta content="C#" name="CODE_LANGUAGE">
              <meta content="JavaScript" name="vs_defaultClientScript">
              <meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">
       </HEAD>
       <body>
              <form runat="server">
                     <asp:datagrid id="DataGrid1" runat="server" BorderWidth="1px" BorderColor="Black" Font-Size="12pt"
                            AlternatingItemStyle-BackColor="#eeeeee" HeaderStyle-BackColor="#aaaadd" PagerStyle-HorizontalAlign="Right"
                            CellPadding="3" AllowPaging="True" AllowCustomPaging="True" AutoGenerateColumns="False" OnPageIndexChanged="MyDataGrid_Page"
                            PageSize="15" AllowSorting="True" OnSortCommand="DataGrid1_SortCommand">
                            <AlternatingItemStyle BackColor="#EEEEEE"></AlternatingItemStyle>
                            <ItemStyle Font-Size="Smaller" BorderWidth="22px"></ItemStyle>
                            <HeaderStyle BackColor="#AAAADD"></HeaderStyle>
                            <Columns>
                                   <asp:BoundColumn DataField="ID" SortExpression="ID" HeaderText="ID"></asp:BoundColumn>
                                   <asp:BoundColumn DataField="订单ID" HeaderText="订单ID"></asp:BoundColumn>
                                   <asp:BoundColumn DataField="产品ID" HeaderText="产品ID"></asp:BoundColumn>
                                   <asp:BoundColumn DataField="单价" HeaderText="单价"></asp:BoundColumn>
                                   <asp:BoundColumn DataField="数量" HeaderText="数量"></asp:BoundColumn>
                                   <asp:BoundColumn DataField="折扣" HeaderText="折扣"></asp:BoundColumn>
                            </Columns>
                            <PagerStyle Font-Names="VerDana" Font-Bold="True" HorizontalAlign="Right" ForeColor="Coral"
                                   Mode="NumericPages"></PagerStyle>
                     </asp:datagrid></form>
       </body>
</HTML>
 
 
FastPaging_DataSet.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;
using System.Data.OleDb;
using System.Text;
 
namespace Paging
{
    public class FastPaging_DataSet : System.Web.UI.Page
    {
        protected System.Web.UI.WebControls.DataGrid DataGrid1;
 
        const String QUERY_FIELDS       = "*";          //要查询的字段
        const String TABLE_NAME     = "订单明细表"; //数据表名称
        const String PRIMARY_KEY        = "ID";         //主键字段
        const String DEF_ORDER_TYPE = "ASC";            //默认排序方式
        const String SEC_ORDER_TYPE = "DESC";       //可选排序方式
        const String CONDITION      = "产品ID='AV-CB-1'";
 
        OleDbConnection conn;
        OleDbCommand cmd;
        OleDbDataAdapter da;
 
        #region 属性
 
        #region CurrentPageIndex
        /// <summary>
        /// 获取或设置当前页的索引。
        /// </summary>
        public int CurrentPageIndex
        {
            get { return (int) ViewState["CurrentPageIndex"]; }
            set { ViewState["CurrentPageIndex"] = value; }
        }
        #endregion
 
        #region OrderType
        /// <summary>
        /// 获取排序的方式:升序(ASC)或降序(DESC)。
        /// </summary>
        public String OrderType
        {
            get {
                String orderType = DEF_ORDER_TYPE;
                if (ViewState["OrderType"] != null) {
                    orderType = (String)ViewState["OrderType"];
                    if (orderType != SEC_ORDER_TYPE)
                        orderType = DEF_ORDER_TYPE;
                }
                return orderType;
            }
            set { ViewState["OrderType"] = value.ToUpper(); }
        }
        #endregion
 
        #endregion
   
        private void Page_Load(object sender, System.EventArgs e)
        {
            #region 实现
            String strConn = "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source="
                + Server.MapPath("Northwind.mdb");
            conn = new OleDbConnection(strConn);
            cmd = new OleDbCommand("",conn);
            da = new OleDbDataAdapter(cmd);
 
            if (!IsPostBack) {
                // 设置用于自动计算页数的记录总数
                DataGrid1.VirtualItemCount = GetRecordCount(TABLE_NAME);
 
                CurrentPageIndex = 0;
                BindDataGrid();
            }
            #endregion
        }
 
        #region Web 窗体设计器生成的代码
        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
 
        private void BindDataGrid()
        {
            #region 实现
            // 设置当前页的索引
            DataGrid1.CurrentPageIndex = CurrentPageIndex;
            // 设置数据源
            DataGrid1.DataSource = GetDataView();
            DataGrid1.DataBind();
            #endregion
        }
 
        /// <summary>
        /// 取得数据库表中的记录总数。
        /// </summary>
        /// <param name="tableName">数据库中的表的名称。</param>
        /// <returns>成功则为表中记录的总数;否则为 -1。</returns>
        private int GetRecordCount(string tableName)
        {
            #region 实现
            int count;
            cmd.CommandText = "SELECT COUNT(*) AS RecordCount FROM " + tableName;
            try {
                conn.Open();
                count = Convert.ToInt32(cmd.ExecuteScalar());
            } catch(Exception ex) {
                Response.Write (ex.Message.ToString());
                count = -1;
            } finally {
                conn.Close();
            }
            return count;
            #endregion
        }
 
        private DataView GetDataView()
        {
            #region 实现
            int pageSize = DataGrid1.PageSize;
            DataSet ds = new DataSet();
            DataView dv = null;
           
            cmd.CommandText = FastPaging.Paging(
                pageSize,
                CurrentPageIndex,
                DataGrid1.VirtualItemCount,
                TABLE_NAME,
                QUERY_FIELDS,
                PRIMARY_KEY,
                FastPaging.IsAscending(OrderType) );
 
            try {
                da.Fill(ds, TABLE_NAME);
                dv = ds.Tables[0].DefaultView;
            } catch(Exception ex) {
                Response.Write (ex.Message.ToString());
            }
            return dv;
            #endregion
        }
 
        protected void MyDataGrid_Page(Object sender, DataGridPageChangedEventArgs e)
        {
            CurrentPageIndex = e.NewPageIndex;
            BindDataGrid();
        }
 
        protected void DataGrid1_SortCommand(object source, DataGridSortCommandEventArgs e)
        {
            #region 实现
            DataGrid1.CurrentPageIndex = 0;
            this.CurrentPageIndex = 0;
 
            if (OrderType == DEF_ORDER_TYPE)
                OrderType = SEC_ORDER_TYPE;
            else
                OrderType = DEF_ORDER_TYPE;
 
            BindDataGrid();
            #endregion
        }
    }
}
 
 
       我所要介绍的 DataGrid 连接 Access 的快速分页法就到这里了。如果你有其他更好的分页方法,不如也拿出来跟大家分享!
 
       小弟第一次写文章,有说得不对的地方,希望大家指正。
 
 
作者:黎波
邮箱:itfun@163.com

Access实现limit类似的功能的方法

Access实现limit类似的功能的方法这篇文章的内容如下: Mysql数据库支持LIMIT语句,所以使得翻页易如反掌,比如我们可以这么写: SELECT * FROM Doc WHER...
  • memray
  • memray
  • 2012年10月15日 23:43
  • 4580

access翻页

/// /// access翻页 /// /// /// /// /// /...
  • hutao1101175783
  • hutao1101175783
  • 2014年03月24日 14:36
  • 696

【测试】两种数据库,四种分页算法的效率比较

 分页算法本身没有什么快慢之分,对反应速度起到决定作用的是——能否有效地利用索引! 算法 评价 缺点 适用的数据库 max效率最高的 只能有一个排序字段 Excel、Access、SQL Server...
  • fly_to_the_winds
  • fly_to_the_winds
  • 2009年03月31日 11:36
  • 706

DataGrid连接Access的快速分页法(2)——SQL语句的选用(升序与降序)

作者:黎波一、相关概念     在 ACCESS 数据库中,一个表的主键(PRIMARY KEY,又称主索引)上必然建立了唯一索引(UNIQUE INDEX),因此主键字段的值是不会重复的。并且索引页...
  • 21aspnet
  • 21aspnet
  • 2004年12月23日 10:20
  • 3347

DataGrid基于Access的快速分页法

DataGrid基于Access的快速分页法 撰文/ 黎波 DataGrid是一个功能非常强大的ASP.NET Web服务器端控件,它除了能够方便地按各种方式格式化显示表格中的数据,还可以对表格中的数...
  • sunwestern
  • sunwestern
  • 2004年11月29日 11:49
  • 808

access 报表 分组分页的方法研究

方法1:表的union--->插叙-->报表:好处是不用vba;坏处是需要手动构建空行表B(其中某一行有内容,用来分组分页。 (a)建立基础数据表A和相同数据结构的表B;B表作为用来填空的表。 (b)...
  • zhucehaonan4
  • zhucehaonan4
  • 2015年06月05日 16:43
  • 1017

Access 2000 数据库 80 万记录通用快速分页类

作者:萧月痕(xiaoyuehen)地址:http://blog.csdn.net/xiaoyuehen/archive/2005/01/17/257202.aspx 转贴请包含相关信息, 谢谢.主要...
  • xiaoyuehen
  • xiaoyuehen
  • 2005年01月17日 23:14
  • 8409

DataGrid基于Access的快速分页法

http://soft.yesky.com/SoftChannel/72342380468043776/20041004/1860645.shtml
  • slightboy
  • slightboy
  • 2004年10月25日 09:12
  • 753

如何在DataGrid 控件中实现自定义分页操作

   在一般情况下,DataGrid控件每次翻页操作时,都会将数据源中的数据重新调用依次,当数据源中的数据比较多的时候,这样就会浪费系统的资源和降低程序执行的效率,解决的办法就是如同标题所说,依靠自定...
  • stone0419
  • stone0419
  • 2007年10月06日 14:39
  • 792

DataGrid连接Access的快速分页法——动态生成SQL语句

作者:黎波using System;using System.Text;namespace Paging{    ///     /// FastPaging 的摘要说明。    ///     pu...
  • 21aspnet
  • 21aspnet
  • 2004年12月23日 10:22
  • 2390
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DataGrid连接Access的快速分页法(5)——实现快速分页
举报原因:
原因补充:

(最多只允许输入30个字)