回发后GridView没有正确重新绑定

时间:2009-11-18 21:49:20

标签: asp.net gridview objectdatasource data-binding

我有一个GridView,它有一个指向ObjectDataSource的DataSourceID。 ObjectDataSource指向一个方法,该方法使用ObjectDataSource控件的TypeName,SelectMethod和SelectCountMethod属性返回LINQ IQueryable。发生的事情是数据在前期正确加载。但是,在回发时,如果我从GridView中删除行并尝试使用显式GridView.DataBind()重新绑定,则它不起作用。我知道LINQ正在返回正确的rowcount,因为我调用了countmethod并返回了正确的rowcount。这是一个简单的例子:

<asp:GridView ID="TestGridView" runat="server" PageSize="20" 
    AutoGenerateColumns="false" AllowPaging="true" 
    AllowSorting="false" DataSourceID="TestDataSource">
    <Columns>
        ...
    </Columns>
</asp:GridView>

<asp:ObjectDataSource ID="TestDataSource" runat="server" 
    EnablePaging="true" SelectCountMethod="GetDetailCount" 
    SelectMethod="GetDetails" TypeName="MyApp.PageClass" />

我尝试添加一个按钮并添加TestGridView.DataBind();方法。我已经尝试将其添加到Page_PreRender事件中。无论我尝试什么,它都无法正常工作。

正如有人在下面建议的那样,我也尝试过将它移到Page_Load,但没有去。这是我的代码的一个粗略示例:

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        // Set "initial" query parameters, then ...
        BindData();
    }
}

private void BindData()
{
    // EDITED: Removed the code below since I'm not looking to delete the
    //         rows from the database, but rather get the GridView to rebind
    //         which its not.
    ////Remove all current rows from the GridView
    //int colCount = TestGridView.Rows.Count;
    //for (int x = 1; x <= colCount; x++)
    //{
    //    TestGridView.DeleteRow(x);
    //}

    // Bind GridView to the ObjectDataSource
    TestGridView.DataBind();
}

protected void RegenerateImageButton_Click(object sender, ImageClickEventArgs e)
{
    // Set "updated" query parameters, then ...
    BindData();
}

6 个答案:

答案 0 :(得分:13)

网格视图不会在回发时重新绑定,它们的行将从视图状态撤回。在页面加载(或初始化?)时将gridview的DatasourceID重置为对象数据源ID将导致gridview反弹。

答案 1 :(得分:3)

愚蠢的想法,但您是否使用if(!Page.IsPostBack)检查了网页加载事件?

来自ASP.NET Page Framework Overview

  

Page_Load:在此活动期间,您可以执行一系列操作以首次创建ASP.NET页面或响应帖子产生的客户端事件。在此事件之前已恢复页面和控件视图状态。使用 IsPostBack 页面属性检查这是否是第一次处理页面。如果是第一次,请执行数据绑定。另外,读取和更新控件属性。

在哪里

  

Page_PreRender: PreRender事件在保存视图状态并呈现控件之前触发。您可以使用此事件对控件执行任何最后一刻操作。

实际上

  

因为页面框架是无状态和断开连接的模型,所以每次客户端请求.aspx页面时,在页面处理期间会发生很多事情......

因此,实际上,您可以在设置viewstate之前进行检查,而不是在viewstate恢复之后进行检查。检查if(!Page.IsPostBack)的最常见位置通常在Page_Load事件中。

答案 2 :(得分:2)

您的示例显示

  TestGridView.Columns.RemoveAt(0); 

但你真的是说

  TestGridView.Rows.RemoveAt(0); 

(这是问题吗?)

答案 3 :(得分:2)

我有一个类似的问题,将TreeView动态绑定到XmlDataSource,后者在每次回发时更改了xml源。将EnableCache设置为false修复它。你试过这个吗? (考虑到Linq2sql对象已经缓存,如果你的IQueryable正在使用Linq2sql对象,那就是)

<asp:ObjectDataSource ID="TestDataSource" runat="server" EnableCaching="false"
    EnablePaging="true" SelectCountMethod="GetDetailCount" 
    SelectMethod="GetDetails" TypeName="MyApp.PageClass" />

如果这不起作用,请尝试以上结合:

protected override void OnPreRender(EventArgs e)
{
   base.OnPreRender(e);
   BindData();
}

答案 4 :(得分:0)

在查看了更多的代码之后,我偶然发现了存储在ViewState中的页面属性值。一旦我将其更改为Session,它们就可以工作。

答案 5 :(得分:0)

我有类似的情况,无论我在更新后如何尝试数据绑定,行的更新值都没有显示。

GridView绑定到ObjectDataSource,问题发生在我将其支持对象从DataSet切换到Entity Framework查询后

ViewState启用GridView为我做了诀窍,因此:

<asp:GridView ID="GridViewTransporters" PageSize="100"
runat="server" AllowPaging="True" AllowSorting="True"
AutoGenerateColumns="False" DataSourceID="ObjectDataSourceTransporters"
DataKeyNames="Id" EnableViewState="True">