2010-01-19 44 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