代码之家  ›  专栏  ›  技术社区  ›  cdonner

ASP.Net GridView-更新行命令不会恢复为仅显示

  •  1
  • cdonner  · 技术社区  · 15 年前

    我有一个从LinqDataSource填充的GridView。当我更新一行时,row命令启动,更改被持久化到数据库中,但网格不会刷新。我把它放在UpdatePanel中,并在RowCommand处理程序中显式地调用Update(),但没有回发,页面只是在编辑模式下放在那里。单击“取消”后,它将返回“仅查看”,网格将显示新值。

    <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);
          }
      }
    
    3 回复  |  直到 15 年前
        1
  •  3
  •   cdonner    15 年前

    删除UpdatePanel并关闭GridView的回调后,我在单击Update按钮时收到以下错误:

    找不到与匹配的行 与行相对应的值 从上一次选择返回 活动

    问题是这个数据没有唯一的密钥,因为它是从不同的源动态组装而成的。应该不需要它,但如果没有它,带有LinqDataSource的GridView似乎无法正常工作。 此外,我从没有主键的视图填充网格。 解决方案涉及3个变化:

    • 禁用LinqDataSource的更新
    • 在UpdatePanel上调用Update之前设置YieldGridView.EditIndex=-1

    谢谢你的帮助。

        2
  •  0
  •   Brian Mains    15 年前

        3
  •  0
  •   TheVillageIdiot    15 年前

    试试这个:

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