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

VB.NET如何获取窗体所有控件(含TabControl)及引用运行时创建的DataGridView

解决嵌套容器中查找DataGridView的问题

嘿,这个场景我之前也碰到过!当DataGridView嵌套在TabPage、Panel这类容器控件里时,它们并不在窗体的直接Me.Controls集合中,所以直接用CType(Me.Controls(strGridName), DataGridView)肯定找不到。不过我们可以通过递归遍历所有控件的方式,深入到每一层容器里去查找目标控件。

方法1:根据名称精准查找目标DataGridView

写一个递归函数,它会遍历指定容器(比如窗体)下的所有控件,包括嵌套容器里的子控件,直到找到名称匹配的控件:

Private Function FindControlByName(container As Control, controlName As String) As Control
    ' 先检查当前容器的直接子控件
    For Each ctrl As Control In container.Controls
        If ctrl.Name.Equals(controlName, StringComparison.OrdinalIgnoreCase) Then
            Return ctrl
        End If
        ' 如果当前控件是容器,递归查找它的子控件
        If ctrl.HasChildren Then
            Dim foundCtrl As Control = FindControlByName(ctrl, controlName)
            If foundCtrl IsNot Nothing Then
                Return foundCtrl
            End If
        End If
    Next
    ' 没找到返回Nothing
    Return Nothing
End Function

然后你就可以这样调用它来获取目标DataGridView,再执行更新:

Dim strGridName As String = "你的DataGridView名称"
Dim targetDgv As DataGridView = CType(FindControlByName(Me, strGridName), DataGridView)

If targetDgv IsNot Nothing Then
    ' 执行你的更新逻辑,比如重新查询数据并绑定
    Dim updatedData As DataTable = GetUpdatedDataFromSql() ' 替换成你的SQL查询逻辑
    targetDgv.DataSource = updatedData
End If

方法2:获取窗体中所有的DataGridView(批量操作可用)

如果你需要一次性获取所有DataGridView,或者批量检查更新,也可以用递归收集所有DataGridView到列表中:

Private Sub CollectAllDataGridViews(container As Control, dgvList As List(Of DataGridView))
    For Each ctrl As Control In container.Controls
        ' 如果当前控件是DataGridView,加入列表
        If TypeOf ctrl Is DataGridView Then
            dgvList.Add(CType(ctrl, DataGridView))
        End If
        ' 递归遍历子容器
        If ctrl.HasChildren Then
            CollectAllDataGridViews(ctrl, dgvList)
        End If
    Next
End Sub

调用示例:

Dim allDgvList As New List(Of DataGridView)()
CollectAllDataGridViews(Me, allDgvList)

' 遍历列表找到目标控件并更新
For Each dgv In allDgvList
    If dgv.Name = strGridName Then
        dgv.DataSource = GetUpdatedDataFromSql()
        Exit For
    End If
Next

注意事项

  • 确保运行时创建的DataGridView都设置了唯一的Name属性,不然查找时会出现匹配错误
  • 递归遍历会覆盖所有嵌套层级,不管是TabControl的TabPage,还是Panel、GroupBox这类容器,都能穿透查找
  • 可以用TypeOf提前判断控件类型,避免类型转换时出现异常

内容的提问来源于stack exchange,提问作者Matt Bartlett

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 21:43:09