从嵌套 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
中,ItemTemplate
和EditTemplate
是互斥的,也就是说渲染的时候只会看到其中之一。
同样在后面的代码中,您只能访问 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);
}
希望对您有所帮助。
问题:我正在尝试从 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
中,ItemTemplate
和EditTemplate
是互斥的,也就是说渲染的时候只会看到其中之一。
同样在后面的代码中,您只能访问 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);
}
希望对您有所帮助。