2009-11-18 29 views
7

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

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

再次修改上述内容。 – 2009-11-20 14:30:39

回答

0

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

+6

如果您稍微详细解释一下,我会很乐意为您的解决方案+1。 ;) – 2009-11-20 16:54:03

3

愚蠢的想法,但你检查与if(!Page.IsPostBack)页面加载事件?

ASP.NET Page Framework Overview

的Page_Load:在这种情况下,您可以执行一系列的行动来创建你的ASP.NET页面首次或因下列原因引起的客户端事件一个帖子。页面和控件视图状态在此事件之前已经恢复。使用IsPostBack page属性来检查这是否是第一次处理该页面。如果这是第一次,请执行数据绑定。另外,请阅读并更新控件属性。

凡为

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

实际上

由于页面框架是一种无状态和断开连接的模型,每一次客户端请求.aspx页面,在页面处理过程中发生的许多事情......

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

+0

是的。看下面的代码示例如下:“我尝​​试添加一个按钮并添加TestGridView.DataBind();方法,我已经尝试将它添加到Page_PreRender事件中,无论我尝试什么,它都不起作用。 – 2009-11-19 14:02:50

+0

是的,即使在Page_Load事件中它也不起作用。 – 2009-11-19 18:47:46

+0

更新后的代码向你展示我在做什么。 – 2009-11-19 18:52:04

2

你的例子显示

TestGridView.Columns.RemoveAt(0); 

但你真正的意思

TestGridView.Rows.RemoveAt(0); 

(这是什么问题?)

+0

哇。谢谢杰夫。这有帮助,但它不能解决我的问题。 – 2009-11-20 14:28:32

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

没有。还是行不通。虽然谢谢! – 2009-11-20 15:26:05

+0

谢谢,但我想我明白了。完全无关的问题。 – 2009-11-20 16:44:50

13

Gridback在回发时没有被重新绑定,它们的行从viewstate被拉回。在页面加载(或初始化?)时将gridview的DatasourceID重置为对象数据源ID将导致gridview被反弹。

+0

是的,很好的回答! – Petras 2011-07-15 07:09:58

+0

为我工作....感谢 – 2012-07-13 14:21:53

+1

非常好的解释,但如果问题是ViewState,解决它的正确方法是将EnableViewState =“false”添加到您的GridView。 – Trajan 2016-06-30 06:43:42

0

我有类似的情况,其中一个行的更新值不显示,无论我怎么试图更新后数据绑定。

GridView被绑定到一个ObjectDataSource和发生的问题,我打开后其支持对象从DataSetEntity Framework查询

GridView启用ViewState的伎俩对我来说,这样的:

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