从嵌套 Gridview 行编辑调用时隐藏字段的值重复

Value of HiddenField Duplicated when called from Nested Gridvew Row Editing

问题:我正在尝试从 HiddenField 对象获取一个值并将其设置为一个字符串。 "foo" 的值返回为 "foo, foo"。

详情: 我有一个嵌套的 Gridview,我正在尝试使子 Gridview 可编辑。我有一个方法 GetChildQuery(string id) 形成 sql 查询以获取子 Gridview 的数据,并且我将 id 绑定到 HTML 中的 HiddenField 对象,如下所示:

<asp:Gridview ID="gvChild" runat="server" AutoGenerateColumns="false" OnRowEditing = "gvChild_RowEditing">
 <Columns>
  <asp:TemplateField HeaderText="Name">
   <ItemTemplate>
    <asp:Label runat="server" ID="lblNameChild" Text='<% Eval("Name")%>'></asp:Label>
    <asp:HiddenField runat="server" ID="hidIDChild" Value ='<%# Bind("ItemID") %>' />
   </ItemTemplate>

   <EditItemTemplate>
     <asp:Label runat="server" ID="lblNameChildEdit" Text='<% Eval("Name")%>'></asp:Label>
    <asp:HiddenField runat="server" ID="hidIDChildEdit" Value ='<%# Bind("ItemID") %>' />
   </EditItemTemplate>
  </asp:TemplateField>

我尝试在 OnRowEditing 方法中访问它,例如:

protected void gvhild_RowEditing(object sender, GridViewEditEventArgs e) {
  Gridview child = sender as Gridview;
  string itemID = (child.Rows[e.NewEditIndex].FindControl("hidIDChild") as HiddenField).Value.ToString();
  string sql = GetChildQuery(itemID);
  child.EditIndex = e.NewEditIndex;
  child.DataSource = GetData(sql);
  child.DataBind();
}

我的 SQL 查询的 WHERE 子句中使用了 id,因此如果 id 的值不正确,则输出也不正确。我不知道这个问题的发生是因为我如何将数据绑定到 HiddenField 或我如何从 RowEditing 方法调用它,或者我完全忽略的事情。

Ref: 为了制作嵌套的 Gridview,我主要遵循 https://www.aspsnippets.com/Articles/Nested-GridView-Example-in-ASPNet-using-C-and-VBNet.aspx and https://www.aspforums.net/Threads/133072/Edit-Update-Delete-in-Nested-Child-GridView-in-ASPNet/,它也具有我的 GetData 方法的通用格式。

编辑:通过将 string itemID 实例化替换为

来颠覆问题
string itemID= ((child.Rows[e.NewEditIndex].FindControl("hidIDChild") as HiddenField).Value.Split(','))[0].ToString();

本质上是拆分重复,访问第一个元素,将其转换为字符串,并将其设置为等于 y 字符串 itemID。

然而,尽管这颠覆了问题,但我仍然感谢任何人就问题最初发生的原因提供的反馈。谢谢!

你应该看看你的渲染 html。

处理一个网格视图时,一次只能打开一行进行编辑。而在一行的TemplateField中,ItemTemplateEditTemplate是互斥的,也就是说渲染的时候只会看到其中之一。

同样在后面的代码中,您只能访问 ItemTemplate 行或 EditTemplate 行,具体取决于您在回发时处理的事件。

相同的规则适用于 nested/child 网格视图。

因此对于您描述的情况,我假设您正在尝试使用 parent 中的一些 ID 来构建查询以填充 child。如果是这样,我认为您根本不需要任何隐藏字段。 parents 查询中的 ID 字段名应在 parent 网格视图的 DataKeyNames 属性 中设置。

然后您应该能够将值传递给您为 child 构建的过程,如

protected void gvhild_RowEditing(object sender, GridViewEditEventArgs e) {
  string sql = GetChildQuery(gvParent.SelectedDataKey.Value);

  child.DataSource = GetData(sql);
  child.DataBind();

  // Given that you have just populated the child I do not think the 
  // following is accurate, but that's for you to decide
  child.SetEditRow(e.NewEditIndex);  
}

希望对您有所帮助。