GridView真分页全套复用代码(转)

原文地址:GridView真分页全套复用代码作者:jacland

1、页面部分:

<PagerTemplate>                       
    <div style="display: inline; float:right;">                           
        <asp:TextBox ID="txbPage" runat="server" BorderStyle="none" Text=‘<%# "总共"+ TotalRecord.ToString() + "条记录 当前第" + Convert.ToString(PageIndex+1) + "/" + PageCount + "页" %>‘ ReadOnly="true" Width="250"></asp:TextBox>
        <asp:LinkButton ID="FirstPage" runat="server" CausesValidation="false" CommandArgument="First" CommandName="Page" Enable="<%# PageIndex != 0 %>">第一页</asp:LinkButton>
        <asp:LinkButton ID="PreviousPage" runat="server" CommandArgument=‘<%# PageIndex %>‘ CommandName="Page" Enable="<%# PageIndex != 0 %>">上一页</asp:LinkButton>
        <asp:LinkButton ID="NextPage" runat="server" CommandArgument=‘<%# PageIndex + 2 %>‘ CommandName="Page" Enable="<%# PageIndex != PageCount - 1 %>">下一页</asp:LinkButton>
        <asp:LinkButton ID="LastPage" runat="server" CommandArgument=‘<%# PageCount %>‘ CommandName="Page" Enable="<%# PageIndex != PageCount - 1 %>">最后一页</asp:LinkButton>
        <asp:TextBox ID="TextGotoPage" runat="server" CssClass="TextBox" Width="30"></asp:TextBox>
        <asp:Button ID="PageGo" causesvalidation="False" commandargument="-1" commandname="Page" runat="server" CssClass="Button" Text="Go" Width="25" /></div>

</PagerTemplate>

2、页面代码字段属性

private int totalRcord = 0;
    private int pageIndex = 0;

/// <summary>
    /// GridView的当前页,存储在ViewState中
    /// </summary>
    protected int PageIndex
    {
        get
        {
            if (int.TryParse(ViewState["pageIndex"].ToString(), out pageIndex))
            {
                return pageIndex;
            }
            else
            {
                return 0;
            }
        }
        set
        {
            ViewState.Add("pageIndex", value);
        }
    }

/// <summary>
    /// 页数总计
    /// </summary>
    protected int PageCount
    {
        get { return Convert.ToInt32(Math.Ceiling(Convert.ToDecimal(TotalRecord) / gvwBudInfo.PageSize)); }
    }

/// <summary>
    /// 记录总条数
    /// </summary>
    protected int TotalRecord
    {
        get
        {
            if (int.TryParse(ViewState["totalRecord"].ToString(), out totalRcord))
            {
                return totalRcord;
            }
            else
            {
                return 0;
            }
        }
        set
        {
            ViewState.Add("totalRecord", value);
        }
    }

3、数据绑定

DataSet ds = new BLL().QueryInfo(model, gvw.PageSize, PageIndex, out totalRcord);
gvw.PageIndex = PageIndex == 0 ? 0 : 1;//跳过前面空行
TotalRecord = totalRcord;
gvw.DataSource = ds;

4、翻页事件

GridView theGrid = (GridView)sender;
        int newPageIndex = 0;
        GridViewRow pagerRow = theGrid.BottomPagerRow;
        //GridViewRow pagerRow = theGrid.Controls[0].Controls[theGrid.Controls[0].Controls.Count - 1] as GridViewRow; // refer to PagerTemplate
        //GridView较DataGrid提供了更多的API,获取分页块可以使用BottomPagerRow 或者TopPagerRow,当然还增加了HeaderRow和FooterRow
        if (-2 == e.NewPageIndex)//点击按钮的事件
        {
            TextBox txtNewPageIndex = null;
            if (null != pagerRow)
            {
                // refer to the TextBox with the NewPageIndex value
                txtNewPageIndex = (TextBox)pagerRow.FindControl("TextGotoPage");
            }
            if (null != txtNewPageIndex && txtNewPageIndex.Text != "")
            {
                newPageIndex = int.Parse(txtNewPageIndex.Text) - 1;//Get the NewPageIndex
            }
            else
            {
                newPageIndex = 0;
            }
        }
        else
        {
            //当点击分页连接的时候
            newPageIndex = e.NewPageIndex;
        }
        //处理超出范围的分页
        newPageIndex = newPageIndex < 0 ? 0 : newPageIndex;
        newPageIndex = newPageIndex >= PageCount ? PageCount - 1 : newPageIndex;

((TextBox)pagerRow.FindControl("TextGotoPage")).Text = Convert.ToString(newPageIndex + 1);
        //绑定数据源
        PageIndex = newPageIndex;
        BindInfo();

5、数据操作层

StringBuilder sb = new StringBuilder(" 1 = 1 ");
            if (!string.IsNullOrEmpty(model.YY))    //年度
            {
                sb.Append(string.Format(" AND yy = ‘{0}‘ ", model.YY.Replace("‘", "‘‘")));
            }
            //……//查询条件

SqlParameter[] parameters =
                {
                    new SqlParameter("@tblName", SqlDbType.VarChar),
                    new SqlParameter("@PKName", SqlDbType.VarChar),
                    new SqlParameter("@PageSize", SqlDbType.Int),
                    new SqlParameter("@PageIndex", SqlDbType.Int),
                    new SqlParameter("@OrderField_Type", SqlDbType.VarChar),
                    new SqlParameter("@strWhere", SqlDbType.VarChar),                   
                    new SqlParameter("@FieldList", SqlDbType.VarChar),
                    new SqlParameter("@TotalRecord", SqlDbType.Int),
                };

parameters[0].Value = "v_AppBudInfo";//表名或视图名
            parameters[1].Value = "yy,subID,deptID";//主键及排序字段,逗号后不可有空格
            parameters[2].Value = pageSize;
            parameters[3].Value = pageIndex + 1;
            parameters[4].Value = "yy asc,deptID asc,subID asc";//区分大小写, asc,desc必小写,逗号后不可有空格
            parameters[5].Value = sb.ToString();
            parameters[6].Value = "yy,subID,subName,compID,compName,deptID,DeptName,budtotal,qbudtotal,payouttotal,qpayouttotal,lybudamt,budamt,sbudamt,remark,setdate,userid,downdate,uptodate,upuserid,auddate,auduserid,cleartype,cleartypeName";
            parameters[7].Direction = ParameterDirection.Output; //查询字段,逗号后不可有空格

using (SqlConnection conn = new SqlConnection(SqlHelper.ConnectionStringProfile))
            {
                try
                {
                    conn.Open();
                    SqlCommand cmd = new SqlCommand("GetRecordByPage", conn);
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddRange(parameters);                   
                    SqlDataAdapter da = new SqlDataAdapter(cmd);
                    DataSet ds = new DataSet();
                    da.Fill(ds);
                    totalRecord = Convert.ToInt32(parameters[7].Value);
                    if (totalRecord > 0 && ds.Tables[0].Rows.Count == 0)
                    {//当删除最后一行数据时,可能引起页数变化,重新查询最后一页
                        parameters[3].Value = Math.Ceiling(Convert.ToDecimal(totalRecord) / pageSize);
                        da.Fill(ds);
                    }
                    //生成伪数据,便于使GridView显示分页栏
                    for (int i = 0; i < (pageIndex == 0 ? 0 : pageSize); i++)
                    {
                        ds.Tables[0].Rows.InsertAt(ds.Tables[0].NewRow(), 0);
                    }
                    if (totalRecord > (pageIndex + 1) * pageSize)
                    {
                        ds.Tables[0].Rows.Add(ds.Tables[0].NewRow());
                    }                           
                    return ds;
                }
                catch (SqlException)
                {
                    totalRecord = 0;
                    return null;
                }
            }

6、存储过程

CREATE   PROCEDURE GetRecordByPage
--自写,采用反向排序的方式,非主键或唯一键操作引起严重后果,添加不合理的where条件也是
--字段列表用逗号隔开,不可有任何空格
--排序字段也当作主键字段传入
    @tblName          varchar(255),       -- 表名
    @PKName          varchar(255),       -- 主键字段名
    @PageSize         int = 10,           -- 页尺寸
    @PageIndex        int = 1,            -- 页码   
    @OrderField_Type       varchar(255) = ‘‘,  -- 排序字段及方式,用逗号隔开, asc,desc必须小写
    @strWhere         varchar(1000) = ‘‘, -- 查询条件 (注意: 不要加 where)   
    @FieldList        varchar(1000)  ,      -- 返回的字段,用逗号隔开
    @TotalRecord    int = 0      out      -- 返回记录总数
AS

declare @strSQL   varchar(6000)       -- 主语句
declare @strTmp   varchar(400)        -- 临时逆向排序表达
declare @strOrder varchar(400)        -- 排序子句
declare @RecordCount integer          -- 记录总数

if @PageSize < 1    --页面大小不小于1
    set @PageSize = 10;

if @PageIndex < 1    --页码不小于1
    set @PageIndex = 1

if @strWhere != ‘‘    --生成where条件
    set @strWhere = ‘ where ‘ + @strWhere

--查询总数
    set @strSQL = ‘select @Count = count(*) from [‘ + @tblName + ‘] ‘+ @strWhere

declare @a nvarchar(4000)    --把@strSQL转换为nvarchar的临时变量
    set @a = cast(@strSQL as nvarchar(4000))

exec sp_executesql @a,N‘@Count int output‘,@RecordCount output
    set @TotalRecord = @RecordCount
--查询记录       
        if @PageIndex = 1    --页数为第1页时,直接查询
            begin
                if @OrderField_Type != ‘‘    --有排序字段
                    set @strOrder = ‘ order by ‘ + @OrderField_Type
                else            --无排序字段
                    set @strOrder = ‘ order by ‘ + @PKName +‘ ‘

set @strSQL = ‘select top ‘ + str(@PageSize) + ‘ ‘ + @FieldList + ‘ from [‘+ @tblName + ‘] ‘ + @strWhere + ‘ ‘ + @strOrder
            end
        else
            begin
                if @OrderField_Type != ‘‘    --有排序字段
                    begin                        --此处区分大小写!!!!
                        set @strTmp = replace(@OrderField_Type, ‘asc‘, ‘temp‘)
                        set @strTmp = replace(@strTmp, ‘desc‘, ‘asc‘)
                        set @strTmp = replace(@strTmp, ‘temp‘, ‘desc‘)
                        --把排序字段加上前缀                   
                        set @strOrder = ‘ order by ‘+ @tblName + ‘.‘ + replace(@OrderField_Type, ‘,‘, ‘,‘ + @tblName + ‘.‘)               
                        set @strTmp = ‘ order by temp.‘ + replace(@strTmp, ‘,‘, ‘,temp.‘)
                    end

if @RecordCount < (@PageIndex*@PageSize)    --根据记录总条数决定PageSize大小
                    set @RecordCount = @RecordCount - (@PageIndex - 1) * @PageSize
                else
                    set @RecordCount = @PageSize           
                --把字段列表中的主键加上表名前缀 --生成内联条件
                declare @joinField varchar(500)    --内联条件
                declare @i int    --字符旧位置       
                set @i = 0
                declare @index int --字符新位置
                set @index = charindex(‘,‘,@PKName, 0)
                if @index = 0    --没有逗号,只有一个字段
                    begin
                        set @FieldList = ‘,‘ + @FieldList    --加个逗号,区分完整字段
                        set @FieldList = replace(@FieldList,‘,‘ +  @PKName + ‘,‘ ,‘,‘ +  @tblName + ‘.‘ + @PKName + ‘,‘)
                        set @FieldList = substring(@FieldList, 2, Len(@FieldList) - 1)
                        set @joinField = @tblName + ‘.‘ + @PKName + ‘ =  temp2.‘ + @PKName
                    end
                else    --有多个字段
                    begin
                        set @joinField = ‘ 1 = 1 ‘   
                        set @FieldList = ‘,‘ + @FieldList    --加个逗号,区分完整字段
                        declare @PKTemp varchar(255)--临时主键列表           
                        WHILE @index > 0
                        BEGIN                           
                            set @PKTemp = substring(@PKName, @i + 1, @[email protected] - 1) --左边第一个字段
                            set @joinField = @joinField + ‘ AND ‘ + @tblName + ‘.‘ + @PKTemp + ‘ =  temp2.‘ + @PKTemp --生成内联条件
                            set @FieldList = replace(@FieldList,‘,‘ +  @PKTemp + ‘,‘ ,‘,‘ + @tblName + ‘.‘ + @PKTemp + ‘,‘) --替换
                            set @i = @index
                            set @index = charindex(‘,‘, @PKName, @i+1)--下一个逗号  
                        END
                        set @PKTemp = substring(@PKName, @i + 1, len(@PKName)[email protected]) --左边第一个字段
                        set @joinField = @joinField + ‘ AND ‘ + @tblName + ‘.‘ + @PKTemp + ‘ = temp2.‘ + @PKTemp --生成内联条件
                        set @FieldList = replace(@FieldList,‘,‘ +  @PKTemp + ‘,‘ ,‘,‘ +  @tblName + ‘.‘ + @PKTemp + ‘,‘) --替换
                        set @FieldList = substring(@FieldList, 2, Len(@FieldList) - 1)
                    end

--把主键列表加上表名前缀
                set @PKName = @tblName + ‘.‘ + @PKName;--给第一个主键加上表名前缀
                set @PKName = replace(@PKName, ‘,‘, ‘,‘ + @tblName + ‘.‘)--给后面的主键加上表名前缀

set @strSQL = ‘select top ‘+str(@RecordCount)+‘ ‘[email protected]+‘ from [‘[email protected]+‘] inner join
                        (select top ‘+str(@RecordCount)+‘ ‘+replace(@PKName, @tblName , ‘temp‘)+‘ from
                            (select top ‘+str(@PageIndex*@PageSize)+‘ ‘[email protected]+‘ from [‘[email protected]+‘] ‘[email protected]+‘ ‘[email protected]+‘ ) as temp
                           ‘[email protected]+‘
                        )  as temp2 on ‘ + @joinField + ‘ ‘ + @strOrder+‘ ‘
            end
exec (@strSQL)
GO

GridView真分页全套复用代码(转)

时间: 2024-08-02 20:08:18

GridView真分页全套复用代码(转)的相关文章

网站真分页js代码该怎么写?

真分页这个词对程序猿们来说,并不是一个陌生的词汇,但是如果你是初次学习真分页,或许还是得花点时间小小研究下,下面是之前去转盘网(喜欢的可以看看,也可以进入引擎模式)的真分页js部分代码,html部分的我就不写了,稍微处理下代码就可以使用的,你也可以根据需要灵活变动,千万不要懒惰哦,废话不说了,直接上代码: function get_param(param){ //这个函数是用来获取url的参数的 var query = location.search.substring(1).split('&'

[小技巧]让你的GridView支持IQueryable,并自动实现真分页

众所周知,asp.net自带的GridView在自带分页方面设计得很2,因为它是假分页,即内存分页.而且它不智能支持强大的Iqueryable. 但这表明微软忽略了现实中的分页需求吗?答案应该不是,我想也不是. 那么,通过什么方式可以达到真分页的效果呢?使用Asp.Net自带的3种DataSource(objectdatasource, entitydatasource, linqdatasource). 三种datasource各有所长. 但这样做还是有些麻烦呀…… 朋友有一个项目,之前数据少

Java代码实现真分页

在JavaWeb项目中,分页是一个非常常见且重要的一个小方面.本次作为记载和学习,记录项目中出现的分页并做好学习记录.在这里,用的是SSH框架.框架可以理解如下图: 在JSP页面,描写的代码如下: 1 <div align="center"> 2 <c:if test="${page.currentPage>1}"> 3 <a href="show_findStessayAll.action?currentPage=1&

ASP.NET真假分页—真分页

 承接上篇博文<ASP.NET真假分页-假分页>:http://blog.csdn.net/u010773667/article/details/38845009,继续讲解ASP.NET真假分页之真分页. 真分页 当数据量过大,有几万甚至十几万条数据时,每次都从数据库中取出所有数据就会降低查询效率,系统运行慢,还有可能卡死,这时假分页就会显得很不人性化,因此有了真分页的必要性. 正如上篇博文总结归纳,"真"相对于"假"存在,即不藕断丝连,从根部彻底断

gridview自定义分页 aspNetPager用法

这几天做gridview分页,自带的分页不好用.从网上搜刚开始搜了一个aspNetPager.dll,替换原来的一个dll,自己设置了一些,比如这个控件不显示中文,后来我改成中文的"上一页"."下一页"."首页""尾页",把ShowPageIndexBox设置为默认true,这样当前页也显示了,还能跳转. 还设置了 显示自定义区域,默认是不显示了,我改成left,然后再设置下自定义的html,结果就可以显示了,我显示的是 一共

ASP.NET实现弹出框真分页将复选框选择的数据存到数据库中(一)

ASP.NET实现弹出框真分页将复选框选择的数据存到数据库中,这个问题分一下几步走 1.将弹出框真分页后复选框选择的数据保存. 2.将弹出框保存的数据传到父页面上. 3.将数据在父页面上显示. 4.点击保存将信息存入数据库中. 首先来第一步将弹出框真分页后复选框选择的数据保存. 思路很简单就是先真分页,然后在点击下一页的时候扫描这一页所有点击复选框的数据保存到一个变量数组中.下面就是主要代码: ASP代码: <%@ Page Language="C#" AutoEventWire

分页“真分页”获取数据

对于初学的新手来说,做数据分页的时候,经常是去网上下载个控件,所谓控件分页,有的人认为很好,因为方便,但是对于老鸟来说 控件分页查询效率太低,在实际工作中,也会带来致命的弱点,所以,我们一般采用真分页,部分查询,效率没得说!! 石家庄ReactNative交流群 526955818欢迎大家加入 using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threadi

Jsp分页实例---真分页

网页的分页功能的实现比较简单,实现方法也多种多样. 今天总结一个简单的Jsp真分页实例. 首先,提到分页就要先明确一个概念,何为真分页何谓假分页. 假分页:一次性从数据库读出表的所有数据一次性的返回给客户端,由js来控制每一页的显示. 真分页:由程序控制,每一次只返回一页大小的数据,显示到客户端. 由此可以很清楚的分辨出真假分页各自的优缺点: 假分页:由于一次性读出所有数据并返回给客户端,如果数据量庞大,所以这一次的动作可能是非常消耗服务器资源和带宽的, 但是返回给客户端以后就非常轻松了,客户在

ngTbale真分页实现排序、搜索等功能

一. 真分页表格基础 1. 需求:分页,排序,搜索都是需要发API到服务端. 2. JS实现代码: getStorage是localStorage一个工具方法,可以自己写这个方法. API参数如下: { limit: initItemCountPerPage, index: options1.page, sortKey: options1.sortKey ? encodeURIComponent(options1.sortKey) : '', sortType: options1.sortTyp