2010-01-19 42 views
1

我有一個從LinqDataSource填充的GridView。當我更新一行時,RowCommand觸發並且更改持久化到數據庫,但不刷新網格。我在UpdatePanel中顯式調用了RowCommand處理程序中的Update(),但沒有回傳,頁面在Edit模式下就位於那裏。一旦我點擊取消,它將返回到僅查看,網格顯示新值。ASP.Net GridView - 更新行命令不恢復爲僅顯示

我懷疑GridView中有關數據源的佈線是錯誤的。儘管如此,沒有例外冒出來。下面是一個精簡的標記副本。有任何想法嗎?

<asp:UpdatePanel ID="uPanel" runat="server" UpdateMode="Conditional" 
    EnableViewState="true" ChildrenAsTriggers="true"> 
    <ContentTemplate> 
    <asp:LinqDataSource ID="YieldDataSource" runat="server" 
     ContextTypeName="myhDataContext" TableName="vw_drug_yields" 
     OnSelecting="YieldDataSource_Selecting" EnableUpdate="true" /> 
    <asp:GridView ID="YieldGridView" runat="server" Width="900px" 
     OnRowDataBound="editGrid_RowDataBound" 
     DataSourceID="YieldDataSource" EnableViewState="true" 
     OnRowCommand="YieldGridView_RowCommand"> 
    <Columns> 
     <asp:TemplateField HeaderText="Net Fill" ItemStyle-HorizontalAlign="Center"> 
      <ItemTemplate><%# DataBinder.Eval(Container.DataItem, "net_fill") %> 
      </ItemTemplate> 
      <EditItemTemplate><asp:TextBox ID="tbNetFill" runat="server" 
      Text='<%# DataBinder.Eval(Container.DataItem, "net_fill") %>' > 
      </asp:TextBox></EditItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField ShowHeader="False" ItemStyle-Width="40px"> 
      <ItemTemplate> 
      <asp:ImageButton CommandName="Edit" ID="btnEdit" SkinID="btnEdit" 
      runat="server" ToolTip="Edit" CausesValidation="false"/> 
      </ItemTemplate> 
      <EditItemTemplate> 
      <asp:ImageButton CommandName="Update" ID="btnSubmit" SkinID="btnSubmit" 
      runat="server" ToolTip="Save" CausesValidation="true" 
      CommandArgument="<%# ((GridViewRow) Container).DataItemIndex %>" /> 
      <asp:ImageButton CommandName="Cancel" ID="btnCancel" SkinID="btnCancel" 
      runat="server" ToolTip="Cancel" CausesValidation="false"/> 
      </EditItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
    </asp:GridView></ContentTemplate></asp:UpdatePanel> 

的處理程序:

protected void YieldGridView_RowCommand(Object sender, 
     GridViewCommandEventArgs e) { 
    if (e.CommandName == "Update") { 
     try { 
      int index = Convert.ToInt32(e.CommandArgument); 

      GridViewRow gdrow = YieldGridView.Rows[index]; 

      // do some validation and handle update 

      db.SubmitChanges(); 

      YieldGridView.DataBind(); 
      uPanel.Update(); 
     } 
     catch (Exception ex) { 
      ShowError(this, "Error while updating yields", ex, true); 
     } 
    } 
+0

您的YieldGridView_RowCommand和Databound事件的外觀如何? 你錯了你的onRowDataBound?只是好奇爲什麼它是editGrid_RowDataBound而不是YieldGridView_RowDataBound – Wil 2010-01-19 18:03:29

+0

editGrid_RowDataBound在我的BasePage中被重載,並做了一些通用的格式設置。我從另一個頁面複製了所有代碼,它工作的很好。唯一不同的是,我的數據源是一個視圖,而不是表格,但是我的更新與表格不一致。 – cdonner 2010-01-19 18:14:12

+0

考慮到這一點並沒有什麼區別,順便說一句。 – cdonner 2010-01-19 18:15:28

回答

3

取出的UpdatePanel和關閉回調爲GridView後,我收到點擊更新按鈕時出現以下錯誤:

找不到完全匹配的行 給定的鍵存儲在ViewState中的原始值 。確保 '密鑰'字典包含唯一密鑰 值,該值對應於從前一個選擇 操作返回的行 。

問題是沒有單一的唯一鍵爲這個數據,因爲它是從不同的來源動態組裝。它不應該是必需的,但似乎與LinqDataSource的GridView不能沒有它的功能。 另外,我從一個沒有主鍵的View填充網格。 該解決方案涉及3個變化:

  • 爲的LinqDataSource
  • 禁止更新改變從更新的命令名稱MyUpdate(這樣的LINQ不會嘗試自動線吧)
  • 設置YieldGridView.EditIndex = -1之前UpdatePanel更新

感謝您的幫助。

0

之前調用Update()調用GridView.DataBind()重新綁定對LinqDataSource控件。

+0

我剛添加了代碼隱藏功能。這就是我正在做的。 – cdonner 2010-01-19 18:03:58

+0

奇怪然後...試試這個,在db.SubmitChanges()方法調用上放一個斷點。在您完成並運行它之前,請在即時窗口中檢查db.GetChangeSet(),並查看是否存在任何插入,更新或刪除操作。變更集是找出變化的方法。查看是否有更新排隊。 – 2010-01-19 19:04:14

+0

我沒有使用GridView的更新機制,所以我不在乎是否有更改集。我在我的方法中獲取rowindex,從行中提取我需要的數據,然後運行Linq查詢來更新行。 – cdonner 2010-01-19 19:45:42

0

試試這個:

YieldGridView.DataBind(); 
//though this seems useless after call to DataBind, but lets just try :) 
YieldGridView.EditIndex = -1; 
uPanel.Update(); 
+0

哈,這是我在發佈之前嘗試過的一件事 - 無濟於事。 – cdonner 2010-01-19 19:43:54

+0

就像我說的,沒有回傳,所以不管我做什麼,它都不刷新。但代碼完全執行,並且沒有例外(我可以看到)。 – cdonner 2010-01-19 19:44:45