2009-11-18 59 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">