7

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

<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();
}
4

6 回答 6

13

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

于 2010-08-18T14:34:51.160 回答
3

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

来自ASP.NET 页面框架概述

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

然而

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

有效

因为页面框架是一个无状态的a和断开的模型,每次客户端请求一个.aspx页面时,页面处理过程中都会发生很多事情......

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

于 2009-11-18T22:06:34.897 回答
2

您的示例显示

  TestGridView.Columns.RemoveAt(0); 

但你真的是说

  TestGridView.Rows.RemoveAt(0); 

(这是问题所在吗?)

于 2009-11-19T21:15:54.640 回答
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();
}
于 2009-11-20T14:40:18.773 回答
0

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

于 2009-11-20T16:44:27.667 回答
0

我遇到过类似的情况,无论我在更新后如何尝试数据绑定,都不会显示行的更新值。

GridView绑定到 a ,并且在ObjectDataSource我将其支持对象从 a 切换DataSetEntity Framework查询后出现问题

启用ViewStateGridView我来说是诀窍,因此:

<asp:GridView ID="GridViewTransporters" PageSize="100"
runat="server" AllowPaging="True" AllowSorting="True"
AutoGenerateColumns="False" DataSourceID="ObjectDataSourceTransporters"
DataKeyNames="Id" EnableViewState="True">
于 2017-09-12T09:01:52.587 回答