三层嵌套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
相关产品推荐
相关产品推荐

