如何在GridView中获取父级DetailsView的数据源字段值?
如何在嵌套的GridView中访问父级DetailsView的数据源数据?
你遇到的这个场景很常见——当DetailsView里嵌套了GridView时,GridView的Eval()默认只能访问自身绑定的数据源,没法直接拿到父级DetailsView的数据。下面给你几个实用的解决方案:
方法1:通过NamingContainer直接获取父级数据(无需后台代码)
你可以利用ASP.NET控件的NamingContainer属性向上遍历控件层级,找到父级DetailsView的DataItem,然后取出需要的字段值。
修改你前台的Label代码如下:
<asp:Label Text='<%# ((System.Data.DataRowView)((DetailsView)Container.NamingContainer.NamingContainer).DataItem)["你的source1列名"] %>' runat="server" />
解释:
Container代表当前GridView的ItemTemplate容器(GridViewRow)- 第一次
NamingContainer会到GridView本身,第二次就到了父级DetailsView的ItemTemplate容器(DetailsViewItem) - 把
DataItem转成DataRowView(如果你的数据源是DataTable/DataView的话,其他类型可以对应转换,比如实体类就直接转成实体类型),然后通过索引获取字段值
方法2:在后台事件中传递父级数据
如果需要更灵活的处理(比如复杂逻辑、类型转换),可以通过DetailsView和GridView的DataBound事件来传递数据:
后台C#代码:
protected void det1_ItemDataBound(object sender, DetailsViewItemEventArgs e) { // 只处理数据行 if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { // 找到嵌套的GridView GridView grid1 = (GridView)e.Item.FindControl("grid1"); if (grid1 != null) { // 获取父级DetailsView的数据项 DataRowView parentDataItem = (DataRowView)e.Item.DataItem; // 把需要的父级字段值存到GridView的ViewState(或者自定义属性) grid1.ViewState["ParentColumnValue"] = parentDataItem["你的source1列名"].ToString(); // 绑定GridView的ItemDataBound事件 grid1.ItemDataBound += Grid1_ItemDataBound; } } } protected void Grid1_ItemDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { // 找到要赋值的Label Label parentColumnLabel = (Label)e.Row.FindControl("parentColumnLabel"); if (parentColumnLabel != null) { // 从GridView的ViewState中取出父级字段值 string parentValue = (string)((GridView)sender).ViewState["ParentColumnValue"]; parentColumnLabel.Text = parentValue; } } }
前台对应的Label:
<asp:Label ID="parentColumnLabel" runat="server" />
方法3:通过数据源参数关联(如果需要联动查询)
如果你的source2是SqlDataSource这类数据源,还可以直接通过ControlParameter把父级DetailsView的字段作为参数传递给子数据源,这样既可以关联查询,也可以在GridView中使用这个参数值:
<asp:SqlDataSource ID="source2" runat="server" SelectCommand="SELECT *, @ParentColumn AS ParentColumn FROM ChildTable WHERE ParentID = @ParentID"> <SelectParameters> <!-- 传递父级的ID用于查询 --> <asp:ControlParameter Name="ParentID" ControlID="det1" PropertyName="SelectedValue" /> <!-- 传递父级的字段值用于显示 --> <asp:ControlParameter Name="ParentColumn" ControlID="det1" PropertyName="DataItem.你的source1列名" /> </SelectParameters> </asp:SqlDataSource>
然后在GridView里就可以直接Eval("ParentColumn")来显示父级字段了。
内容的提问来源于stack exchange,提问作者Yevgeni Grinberg
相关产品推荐
相关产品推荐

