启用分页后,Gridview 在回发时消失

问题描述 投票:0回答:2

我有一个 gridview,其 DataSourceID 属性设置为自定义 ObjectDataSource 对象。当AllowPaging 设置为True 时,GridView 在回发后消失。如果我将AllowPaging 设置为False 就可以了。有人可以帮我解释一下吗? :)

编辑:我感到困惑的另一件事是我认为如果您设置DataSourceID,网格就会在需要时从数据源获取数据。如果网格因为没有保存数据而消失,为什么 gridview 不能从数据源获取所需的数据?

asp.net gridview pagination postback objectdatasource
2个回答
4
投票

发生回发后,数据源可能不会被维护或重新填充,并且没有项目可以填充网格。 启用分页时,您是否正确处理数据源对象的状态(重新绑定/保持源活动)?

这听起来像是一个模糊的答案,但如果没有源如何获取数据的示例,就很难诊断为什么这些项目会消失。

编辑:
我想到的方法是回调分页/排序。 不过,我确实找到了一些有关 ODS 和分页的信息..请确保您已设置以下内容:

  1. GridView:AllowPaging,当然你需要设置PageSize。
  2. ObjectDataSource:EnablePaging,还需要设置:
    • 最大行参数名称=“最大行数”
    • StartRowIndexParameterName=“startRowIndex”
    • SelectCountMethod="RecordCount"

我认为如果你想手动处理分页大小等,你只需要设置第2项的3个子项。

然后您可以在此处阅读更多相关内容。


0
投票

为了回答@adam0101的更多回复,我认为他所说的“...事实证明我的自定义数据源返回记录计数为零。”,你可能需要“重新附加” ” 将数据源添加到 gridview。 ASP.net 自动知道您正在检索记录“n”,其中“n”是下一页的下一个第一行。此解决方案更适合您不想允许 ASP.NET 在网格视图中“自动处理数据”的情况,可能是因为想要在另一个事件(例如“加载数据”按钮)之后加载数据,而不是当页面已首次加载。但正如 Adam 在下面提到的,真正的原因是他“...创建了一个继承 ObjectDataSource 的数据源子类,但它的实现不正确。”。抱歉我的假设是亚当。谢谢 但是,我认为我的解决方案的其余部分将适用于那些坚持使用手动派生的数据源的人。

按照上面设置 GridView,并注意 - 没有 DataSource 属性!这是我的例子:

<asp:GridView ID="gvStudents" DataKeyNames="StudentID" runat="server" ShowFooter="True" AutoGenerateColumns="False" Width="100%" AllowSorting="True" AllowPaging="true" PageSize="10" OnPageIndexChanging="gvStudents_PageIndexChanging">

接下来创建一个私有方法或例程,当您需要将 gridview 强制到新页面时可以调用它。
private void BindGridViewServer(GridView gv1)
{
    gv1.DataSource = sdsStudents;   //re-attach the datasource
    gv1.DataBind();                 //get a page of data AllowPaging must be true
}

接下来,创建
OnPageIndexChanging
方法:

protected void gvStudents_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
    GridView myGV = (GridView)sender;
    myGV.PageIndex = e.NewPageIndex;
    BindGridViewServer(myGV);
}

为了完成这个答案,这是我的代码,我在需要时加载数据 - 而不是在默认情况下触发 PostPack 时......
    protected void btnSEARCH(object sender, EventArgs e)
        {
//some code
                    //bind the gridview to the datasource here and then bind!
                    gvStudents.DataSource = sdsStudents;
                    gvStudents.DataBind();
//more code etc
        }


最新问题
© www.soinside.com 2019 - 2025. All rights reserved.