You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

三层嵌套GridView:如何用AccessDataSource3填充gvOrders2并查找控件

嘿,我来帮你搞定这个三层嵌套GridView的绑定问题!要给gvOrders里的gvOrders2填充数据,核心思路是给第二层的gvOrders也添加RowDataBound事件,在这个事件里找到gvOrders2并完成数据绑定。具体步骤如下:

第一步:给第二层GridView添加RowDataBound事件

先修改你的HTML代码,给gvOrders加上OnRowDataBound属性,指定对应的事件处理方法:

<asp:GridView ID="gvOrders" runat="server" AutoGenerateColumns="false" CssClass="ChildGrid" OnRowDataBound="gvOrders_RowDataBound">

第二步:编写后台事件处理代码

在VB后台代码中,新增gvOrders_RowDataBound方法,用来处理第二层行绑定的逻辑,找到gvOrders2并绑定AccessDataSource3的数据:

Protected Sub OnRowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs)
    If e.Row.RowType = DataControlRowType.DataRow Then
        ' 这里你原来用了固定值"1",建议改成从当前gvCustomers行获取关联主键(更符合业务逻辑)
        ' 示例:Dim customerKey As String = gvCustomers.DataKeys(e.Row.RowIndex).Value.ToString()
        ' AccessDataSource2.SelectCommand = "SELECT * FROM [Tabella4] WHERE ([关联字段] = '" & customerKey & "')"
        
        ' 暂时保留你原有的固定值逻辑
        Dim code As String = "1"
        AccessDataSource2.SelectCommand = "SELECT * FROM [Tabella4] WHERE ([d] = '" & code & "')"
        Dim gvOrders As GridView = TryCast(e.Row.FindControl("gvOrders"), GridView)
        gvOrders.DataSource = AccessDataSource2
        gvOrders.DataBind()
    End If
End Sub

Protected Sub gvOrders_RowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs)
    If e.Row.RowType = DataControlRowType.DataRow Then
        ' 获取当前gvOrders行的关联字段(这里假设用d字段关联Tabella5)
        Dim dValue As String = DataBinder.Eval(e.Row.DataItem, "d").ToString()
        
        ' 使用参数化查询避免SQL注入(更安全的写法)
        AccessDataSource3.SelectCommand = "SELECT * FROM [Tabella5] WHERE ([d] = ?)"
        AccessDataSource3.SelectParameters.Clear()
        AccessDataSource3.SelectParameters.Add("d", dValue)
        
        ' 先找到嵌套的pnlOrders2面板,再从中获取gvOrders2控件
        Dim pnlOrders2 As Panel = TryCast(e.Row.FindControl("pnlOrders2"), Panel)
        Dim gvOrders2 As GridView = TryCast(pnlOrders2.FindControl("gvOrders2"), GridView)
        
        ' 绑定数据到第三层GridView
        gvOrders2.DataSource = AccessDataSource3
        gvOrders2.DataBind()
    End If
End Sub

关键说明

  • 查找gvOrders2的逻辑:因为gvOrders2嵌套在pnlOrders2面板内部,ASP.NET的FindControl默认只查找直接子控件,所以需要先找到面板,再从面板中定位gvOrders2。
  • 参数化查询:代码里用了参数化方式设置查询条件,比直接拼接字符串更安全,能有效避免SQL注入风险,建议你一直采用这种写法。
  • 数据关联:这里假设Tabella5和Tabella4通过d字段关联,你可以根据自己数据库的实际关联字段调整查询语句。

内容的提问来源于stack exchange,提问作者Daniele Martarelli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 21:23:12