关于GridView和ObjectDataSource结合的分页问题

原创 2006年06月12日 15:11:00

用了我一天的时间,才把这个问题搞明白,其中还参考了许多网友的示例,唉,失败呀~!

先贴一下源码~!

页面的:

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="GetUsers"
            TypeName="DAL.DataManager" EnablePaging="True" MaximumRowsParameterName="maxRows" SelectCountMethod="GetUsersCount" StartRowIndexParameterName="RowIndex">
           <!--注意此处要把参数信息删除-->
        </asp:ObjectDataSource>
        
        <asp:GridView ID="GridView1" runat="server" AllowPaging="True" AutoGenerateColumns="False"
            DataSourceID="ObjectDataSource1">
            <Columns>
                <asp:BoundField DataField="UserName" HeaderText="UserName" SortExpression="UserName" />
                <asp:BoundField DataField="UserID" HeaderText="UserID" SortExpression="UserID" />
                <asp:BoundField DataField="Description" HeaderText="Description" SortExpression="Description" />
            </Columns>
        </asp:GridView>

后台代码:

UserInfo类:

using System;
using System.Collections.Generic;
using System.Text;

namespace DAL
{
   public  class UserInfo
    {
       private int _userid;
       private string _username;
       private string _description;

       public UserInfo()
       { }

       public UserInfo( int userid , string username , string desc )
       {
           _userid = userid;
           _username = username;
           _description = desc;
       }

       public int UserID
       {
           get
           {
               return _userid;
           }
           set
           {
               _userid = value;
           }
       }

       public string UserName
       {
           get { return _username; }
           set { _username = value; }
       }
       public string Description
       {
           get { return _description; }
           set { _description = value; }
       }
    }
}

DataManager类:

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
namespace DAL
{
  
/// <summary>
/// DataManager 的摘要说明
/// </summary>
    public class DataManager
    {
        private SqlConnection con = null; //连接对象
        private SqlCommand cmd = null;  //command执行对象
        private SqlDataAdapter da = null; //适配器对象

        /**/
        /// <summary>
        /// DAL对象构造
        /// </summary>
        public DataManager()
        {
            //
            // TODO: Add constructor logic here
            //
        }

        /**/
        /// <summary>
        /// 打开数据库连接
        /// </summary>
        private void OpenConnection()
        {
            try
            {
                string conString = "server=。;uid=sa;pwd=sa;database=account"; //换成你的数据库
                con = new SqlConnection( conString );
                if ( ConnectionState.Closed == con.State )
                {
                    con.Open();
                }
            }
            catch ( SqlException ex )
            {
                throw new Exception( "数据库无法访问" , ex );
            }
        }

        /**/
        /// <summary>
        /// 关闭数据库连接
        /// </summary>
        private void CloseConnection()
        {
            if ( ConnectionState.Open == con.State )
            {
                try
                {
                    con.Close();
                }
                catch ( SqlException ex )
                {
                    throw new Exception( "数据库无法关闭" , ex );
                }
            }
        }

        /**/
        /// <summary>
        /// 取得用户列表
        /// </summary>
        /// <param name="rowIndex">行索引</param>
        /// <param name="recordCount">页显示量(增量)</param>
        /// <returns>用户列表数据集</returns>
        public IList<UserInfo> GetUsers( int RowIndex , int maxRows )
        {
            OpenConnection();
            IList<UserInfo> user = new List<UserInfo>();
            try
            {
                cmd = new SqlCommand();
                cmd.Connection = con;
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandText = "GetUsers";

                SqlParameter spRowIndex = new SqlParameter( "@pageindex" , SqlDbType.Int , 4 );
                spRowIndex.Direction = ParameterDirection.Input;
                SqlParameter spRecordCount = new SqlParameter( "@pagesize" , SqlDbType.Int , 4 );
                spRecordCount.Direction = ParameterDirection.Input;
                SqlParameter spDocount = new SqlParameter( "@docount" , SqlDbType.Bit );
                spDocount.Direction = ParameterDirection.Input;

                cmd.Parameters.Add( spRowIndex );
                cmd.Parameters.Add( spRecordCount );
                cmd.Parameters.Add( spDocount );

                spRowIndex.Value = RowIndex/maxRows ;    //注意此处GridView传入的不是页码,而是第多少记录,比如第二页的话,他会传入10,第三页传入20,以此...
                spRecordCount.Value = maxRows;
                spDocount.Value = false;

                SqlDataReader dr = cmd.ExecuteReader();

                while ( dr.Read() )
                {
                    UserInfo userinfo = new UserInfo( dr.GetInt32( 0 ) , dr.GetString( 1 ) , dr.GetString( 2 ) );

                    user.Add( userinfo );
                }


              

                return user;
            }
            catch ( SqlException ex )
            {
                throw new Exception( "无法取得有效数据" , ex );
            }
            finally
            {
                CloseConnection();
            }
        }

        /**/
        /// <summary>
        /// 取得用户总数
        /// </summary>
        /// <returns>用户总数</returns>
        public int GetUsersCount( )
        {
            OpenConnection();
            try
            {
                cmd = new SqlCommand();
                cmd.Connection = con;
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandText = "GetUsers";

                SqlParameter spRowIndex = new SqlParameter( "@pageindex" , SqlDbType.Int , 4 );
                spRowIndex.Direction = ParameterDirection.Input;
                SqlParameter spRecordCount = new SqlParameter( "@pagesize" , SqlDbType.Int , 4 );
                spRecordCount.Direction = ParameterDirection.Input;
                SqlParameter spDocount = new SqlParameter( "@docount" , SqlDbType.Bit );
                spDocount.Direction = ParameterDirection.Input;

                cmd.Parameters.Add( spRowIndex );
                cmd.Parameters.Add( spRecordCount );
                cmd.Parameters.Add( spDocount );

                spRowIndex.Value = 1;
                spRecordCount.Value = 10;
                spDocount.Value = true;

                da = new SqlDataAdapter( cmd );

                int count = Convert.ToInt32( cmd.ExecuteScalar().ToString() );
                return count;
            }
            catch ( SqlException ex )
            {
                throw new Exception( "无法取得有效数据" , ex );
            }
            finally
            {
                CloseConnection();
            }
        }
    }
}

存储过程:

CREATE procedure GetUsers
(@pagesize int,
@pageindex int,
@docount bit)
as
set nocount on
if(@docount=1)
select count(UserID) from MyUsers
else
begin
declare @PageLowerBound int
declare @PageUpperBound int
set @PageLowerBound=(@pageindex)*@pagesize
set @PageUpperBound=@PageLowerBound+@pagesize
create table #pageindex(id int identity(1,1) not null,nid int)
set rowcount @PageUpperBound
insert into #pageindex(nid)
select UserID from MyUsers order by UserID desc
select O.*
from MyUsers O,#pageindex p
where O.UserID=p.nid and p.id>@PageLowerBound and p.id<=@PageUpperBound order by p.id
end
set nocount off
GO

好了,表结构不用贴了吧,相信大家已经清楚了。有啥问题可以和我联系:wengnet@gmail.com

用DataList控件和ObjectDataSource在ASP.NET 2.0中实现高效能数据分页

翻译:linqingfeng2006-5-22特别感谢常小妹的支持! Last weekend I posted about how to implement super efficient data...
  • jelink
  • jelink
  • 2006年09月25日 22:53
  • 2719

asp.net中ObjectDataSource的参数值和GridView联合使用

在使用的时候,无论什么 时候调用ObjectDataSource的Seelect方法,它都会首先触发它的Selecting事件 ,然后才调用ObjectDataSource的隐含对象的方法,完成后则激...
  • qin_zhangyongheng
  • qin_zhangyongheng
  • 2012年09月02日 16:05
  • 1697

ObjectDataSource自定义分页

ObjectDataSource是唯一支持自定义分页的数据源,要实现分页效果,首先要将ObjectDataSource.EnablePageing属性设为true,通过三个属性实现:StartRowI...
  • a497785609
  • a497785609
  • 2009年08月19日 15:01
  • 2410

ObjectDataSource 数据源分页机制(转)

简而言之:比起没有分页多了四样东西: 1.一个允许分页熟悉 2.一个获取数据源count绑定函数 34.select函数多了两个参数(一个是开始index,一个是最大index) 示例: 一...
  • lonely_wm
  • lonely_wm
  • 2014年11月26日 23:42
  • 637

使用ObjectDataSource和GridView分页

(本人原创转载请注明地址!代码在VS2005下测试运行通过!) 实体类:using System;using System.Data;using System.Configuration;using ...
  • ahshow
  • ahshow
  • 2007年08月30日 17:04
  • 1039

ObjectDataSource 控件

使用 ASP.NET 2.0 ObjectDataSource 控件(整理自msdn) 摘要:ADO.NET 和 SqlDataSource 使得人们可以很容易地访问 ASP.NET 2.0 中的两层...
  • simachangan
  • simachangan
  • 2007年11月16日 14:21
  • 681

使用ObjectDataSource注意DeleteMethod、UpdateMethod、Insert等方法中参数的命名约定

使用ObjectDataSource注意DeleteMethod、UpdateMethod等方法中参数的命名约定: 如:    如果UpdateMethod原型为:          _   ...
  • kdm8866
  • kdm8866
  • 2013年01月21日 13:23
  • 669

GridView分页(第一页、上一页、下一页、最后页、当前页数/总页数)

 前台GridView页脚代码:PagerTemplate>                                                                    ta...
  • moonnight366
  • moonnight366
  • 2008年01月26日 16:13
  • 5146

ASP.NET GridView分页+排序+自定义样式【常规功能比JS插件使用简单】

现在基本都是在用一些前台table框架,做一些分页加排序处理 脑子里面就记得用repeat 处理完table然后调用第三方tablejs插件做分页和排序。 感觉这样能够做到想要的效果。 但是用第...
  • qq873113580
  • qq873113580
  • 2016年05月16日 15:30
  • 1896

关于GridView查询后分页的问题

昨天一个朋友问到一个关于 GridView查询控件使用查询后不能分页(分页功能没用)的问题。表面看起来好像是可以实现查询后分页的功能,以前在完园网跳骚市场的时候也用到了 GridView查询(查询商品...
  • deltazxm
  • deltazxm
  • 2006年12月18日 18:22
  • 1382
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于GridView和ObjectDataSource结合的分页问题
举报原因:
原因补充:

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