【问题标题】:Gridview disappears on postback when paging is enabled启用分页后,Gridview 在回发时消失
【发布时间】:2010-10-09 16:46:22
【问题描述】:

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

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

【问题讨论】:

    标签: asp.net gridview postback paging objectdatasource


    【解决方案1】:

    为了回答@adam0101 的更多回复,我认为他的意思是“...结果我的自定义数据源返回记录计数为零。” ,是您可能需要将数据源“重新附加”到 gridview。 ASP.net 自动知道您正在检索记录-'n',其中'n' 是下一页的第一行。此解决方案更适用于您不想让 asp.net 在您的 gridview 中自动处理数据的情况,可能是因为想要在另一个事件之后加载数据(例如,加载数据按钮) ,而不是在页面第一次加载时。但正如亚当在下面提到的,真正的原因是他“......创建了一个继承 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
            }
    

    【讨论】:

    • 其实不是这样的。我的回答的意思是我创建了一个继承 ObjectDataSource 的数据源子类,但它实现不正确,因此记录计数实际上返回零。您的其余答案可能是真的,我不知道 - 谢天谢地,我多年来不必使用 WebForms,但这就是我评论的实际含义。
    • 向你致敬,亚当。谢谢。我已经更新了我的回复。
    【解决方案2】:

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

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

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

    1. GridView:AllowPaging,当然你需要设置PageSize。
    2. ObjectDataSource: EnablePaging,还需要设置:
      • MaximumRowsParameterName="maxRows"
      • StartRowIndexParameterName="startRowIndex"
      • SelectCountMethod="RecordCount"

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

    那么你可以阅读更多关于这个here的内容。

    【讨论】:

    • 当 AllowPaging 为 False 我认为网格不会重新绑定,它只是从视图状态中获取值。你是说在启用分页时我必须在每次回发时将数据绑定到gridview,即使我不去不同的页面?我只是点击页面上的一个按钮。
    • 我认为如果通过 id 绑定到数据源,有一种方法可以让网格自行处理分页,但有一个属性必须设置,尽管我可能正在考虑“回调”分页。让我检查一下。否则是的,您通常必须手动处理分页。
    • 读完后:blog.tylerholmes.com/2008/06/… 听起来就像简单地设置 DataSourceID 是让网格在需要数据时自行数据绑定的触发器。
    • 你的最后一次编辑让我看了更多——尤其是第三个项目符号。事实证明,我的自定义数据源的记录数返回零。所以即使数据没有每次反弹,它仍然必须查看每次回发的计数。我修好了它,让它工作了!感谢您的帮助
    • 没问题,很高兴您启动并运行它!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-30
    • 2010-12-28
    • 2015-05-06
    • 2011-12-19
    • 2014-06-08
    相关资源
    最近更新 更多