使用SqlDataAdapter对SqlDataReader数据源进行分页

5
这个问题似乎很常见,我已经阅读了这个答案
不幸的是,我的页面仍然没有分页。以下是我的C#代码:
 SqlCommand command = new SqlCommand("(SELECT ......", Connection);
 SqlDataAdapter myAdapter = new SqlDataAdapter(command);
 DataTable dt = new DataTable();
 myAdapter.Fill(dt);

 command.Connection = connection;
 command.Connection.Open();

 GridView1.DataSource = dt;
 GridView1.DataBind();
 GridView1.AllowPaging = true;
 GridView1.PageSize = 15;

 command.Connection.Close();
 command.Connection.Dispose();

很抱歉,当我这样做时,我的分页没有显示出来。我做错了什么吗?
谢谢。

1
你的查询结果是否确实超过了15条记录?此外,在调用Databind()方法之前,请设置所有与分页相关的属性。 - Hanlet Escaño
哇,这真的很简单。我只需要在databind()之前设置它即可。谢谢! - Kevin
哦,OnPageIndexChanging和OnPageIndexChanged有什么区别? - Kevin
PageIndexChanging事件会在单击分页按钮之一时发生,但在GridView控件处理分页操作之前发生;而PageIndexChanging事件会在单击分页按钮之一时发生,但在GridView控件处理分页操作之后发生。http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.pageindexchanging.aspx和http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.pageindexchanged.aspx。 - Hanlet Escaño
2个回答

6
在调用 Databind() 方法之前,设置所有与分页相关的属性。当您使用 自定义分页 时,您需要处理 GridView1_PageIndexChanging 事件。您需要更改当前的 PageIndex,并像下面这样重新绑定您的 GridView
void bindGridview()
{
    SqlCommand command = new SqlCommand("(SELECT ......", Connection);
    SqlDataAdapter myAdapter = new SqlDataAdapter(command);
    DataTable dt = new DataTable();
    myAdapter.Fill(dt);

    command.Connection = connection;
    command.Connection.Open();
    GridView1.AllowPaging = true;
    GridView1.PageSize = 15;
    GridView1.DataSource = dt;
    GridView1.DataBind();


    command.Connection.Close();
    command.Connection.Dispose();
}

protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
    GridView1.PageIndex = e.NewPageIndex;
    bindGridview();
}

如果你也在Page_Load中绑定GridView,那么应该这样做:
protected void Page_Load(object sender, EventArgs e)
{
    if(!IsPostBack)
        bindGridview();
}

我的第一个databind()是在pageLoad事件中。然而,当我将if(!IsPostBack)添加到GridView1_PageIndexChanging事件中时,当我点击去到gridview的下一页时,第一次什么也不会发生。当我再次点击时,它才会跳转到下一页。如果没有if语句,它会在第一次单击时执行。 - Kevin
不要在PageIndexChanging事件中添加!IsPostBack,就像我在答案中说的那样,在Page_Load中添加即可 :) 我会更新事件以避免混淆 :P - Hanlet Escaño
啊好的,非常感谢!出于好奇,这是做什么用的?因为它似乎在页面加载时没有使用!IsPostBack也能正常工作? - Kevin
1
我怀疑如果没有 !IsPostback,索引是否能正常工作...将其删除并尝试一下...设置它将确保您的 GridView 仅在 pageload 期间加载一次,而不是在所有 postbacks(例如任何单击事件都是 postback) 上全部加载...所以当您点击页面数字时,它就是一个 postback - Praveen Nambiar

3
您需要添加GridViewPageIndexChanging事件以启用分页
protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
    GridView1.PageIndex = e.NewPageIndex;
    bindGridview(); 
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接