自己编写的 objectDataSource 配合 GridView 实现分页

  使用 Gridview 的默认分页功能当然非常简单方便,问题是数据量比较大的时候会有一些延时(因为 Gridview 是把所有记录都加载到内存进行分页的),如果使用objectDataSource 配合 GridView(或其他控件)使用存储过程分页不存在这种情况,可以轻易实现大批量记录分页。

    拿100万条记录试验了一下:sqlDataSource + Gridview 自动分页后每翻一页需要大概10多秒,而使用 objectDataSource + GridView + 存储过程分页,每翻一页只需要不到两秒钟就可以了。

这里面最关键的有几点:
1.存储过程必须的两个参数要搞明白是什么意思,不是随便写个分页的存储过程就能用的!
2.必须给 objectDataSource 的 SelectCountMethod 指定一个返回 int 类型的记录总数
3.objectDataSource 的 EnablePaging 属性值指定为 True  时默认会提交两个参数(maximumRows 和 startRowIndex),就是存储过程中用到的那两个参数。默认在代码中是没有的,但是在 SelectMethod 方法中只管接收就是了(可以手工指定参数名)

数据库结构:

Code

 

存储过程:


CREATE PROCEDURE [dbo].[SelectT12]
(
    @StartRowIndex int = null,
    @MaximumRows int = null
)
AS
SET NOCOUNT ON
DECLARE @PageLowerBound int
DECLARE @PageUpperBound int

-- Set the page bounds
SET @PageLowerBound = @StartRowIndex
SET @PageUpperBound = @PageLowerBound + @MaximumRows + 1

SELECT * FROM T12
    WHERE ID > @PageLowerBound And ID < @PageUpperBound

    RETURN

 

页面布局:


    <div>
        
        <asp:ObjectDataSource ID="objectDS" runat="server" EnablePaging="True"
            SelectCountMethod="SelectT12Count" SelectMethod="SelectT12" TypeName="T12">
        </asp:ObjectDataSource>
        <asp:GridView ID="GridView1" runat="server" DataSourceID="objectDS" 
            AllowPaging="True" PageSize="5" Font-Names="宋体" Font-Size="9pt" 
            Width="340px">
        </asp:GridView>
        <br />
        
    </div>

 

实体类:


/// <summary>
/// 实体类
/// </summary>
public class T12
{
    #region 私有成员

    public string cns
    { get { return ConfigurationManager.ConnectionStrings["mydb"].ConnectionString; } }

    #endregion

    #region 公共方法

    public IEnumerable SelectT12(int startRowIndex,int maximumRows)
    {
        SqlConnection cn = new SqlConnection(cns);
        SqlCommand cmd = new SqlCommand();

        cmd.CommandText = "SelectT13";
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Connection = cn;
        cmd.Parameters.Add("@StartRowIndex", SqlDbType.Int).Value = startRowIndex;
        cmd.Parameters.Add("@MaximumRows", SqlDbType.Int).Value = maximumRows;        

        SqlDataAdapter DA = new SqlDataAdapter(cmd);
        DataSet ds = new DataSet();

        cn.Open();
        DA.Fill(ds);
        cn.Close();

        return ds.Tables[0].DefaultView;
    }

    public int SelectT12Count()
    {
        SqlConnection cn = new SqlConnection(cns);
        SqlCommand cmd = new SqlCommand("select count(0) from T12", cn);

        cn.Open();
        int count = (int)cmd.ExecuteScalar();
        cn.Close();

        return count;
    }

    #endregion
}

 

 

换个样式
再完美一点,增加一个 dropdownlist 选择页码,把翻页换成下边图片中的样式:

 

Gridview 增加页码样式定义:


        <asp:GridView ID="GridView1" runat="server" DataSourceID="objectDS" 
            AllowPaging="True" PageSize="50" Font-Names="宋体" Font-Size="9pt" 
            Width="577px" OnDataBound="GridView1_DataBound">
            <PagerSettings Position="Top" />
            <PagerTemplate>
                <div style="float: left; width: 50%">
                    当前页:<asp:DropDownList ID="DropDownList1" runat="server" Font-Names="Tahoma" 
                        Font-Size="8pt" AutoPostBack="True" 
                        onselectedindexchanged="DropDownList1_SelectedIndexChanged"/>
                </div>
                <div style="width: 50%; float: right">
                    <asp:LinkButton ID="LinkButton1" runat="server" CommandName="Page" CommandArgument="First">&le;First</asp:LinkButton>
                    &nbsp;-
                    <asp:LinkButton ID="LinkButton2" runat="server" CommandName="Page" CommandArgument="Prev">&lt;Prev</asp:LinkButton>
                    &nbsp;-
                    <asp:LinkButton ID="LinkButton3" runat="server" CommandName="Page" CommandArgument="Next">Next&gt;</asp:LinkButton>
                    &nbsp;-
                    <asp:LinkButton ID="LinkButton4" runat="server" CommandName="Page" CommandArgument="Last">Last&ge;</asp:LinkButton>
                </div>

            </PagerTemplate>
            <PagerStyle Height="20px" />
        </asp:GridView>

 

翻页代码:


    protected void GridView1_DataBound(object sender, EventArgs e)
    {
        DropDownList pageList;
        pageList = (DropDownList)GridView1.TopPagerRow.Cells[0].FindControl("DropDownList1");

        for (int i = 1; i <= GridView1.PageCount; i++)
        {
            ListItem li = new ListItem(i.ToString()+" / "+GridView1.PageCount.ToString());
            if (i == GridView1.PageIndex + 1) li.Selected = true;
            pageList.Items.Add(li);
        }
    }

    protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
    {
        DropDownList pageList = (DropDownList)GridView1.TopPagerRow.FindControl("DropDownList1");
        GridView1.PageIndex = pageList.SelectedIndex;
    }

 

 

转自:http://www.cnblogs.com/jarod99/archive/2009/01/22/1379758.html

转载于:https://www.cnblogs.com/terryxym/archive/2012/12/18/2823404.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值