查找窗体上的所有控件,甚至是选项卡控件中的控件 - VB.net

Find all controls on a form, even those within Tab Controls - VB.net

我有一组在 运行 时间创建的 DataGridView,我需要引用它们以在进行更改时更新它们。 我知道我可以使用

Dim dgvUpdate As DataGridView
dgvUpdate = CType(Me.Controls(strGridName), DataGridView)

获取我需要的数据网格,他们重新 运行 SQL 并重新执行 DataGridView.DataSource.

但是,这些 DataGridView 位于任意数量的不同 TabControl 中的 TabPage 中,因此不会出现在 Me.Controls

有没有一种方法能够在代码中引用当前表单中的所有控件,而不考虑选项卡、面板等,我可以在 Ctype 方法中使用它来获取正确的数据网格视图。

您可以使用以下方法按 Tab 键顺序获取窗体上的每个控件:

Public Iterator Function GetControls() As IEnumerable(Of Control)
    Dim ctrl = GetNextControl(Me, True)

    Do Until ctrl Is Nothing
        Yield ctrl

        ctrl = GetNextControl(ctrl, True)
    Loop
End Function

如果你想用它来获取每个 DataGridView:

For Each grid In GetControls().OfType(Of DataGridView)()
    'Use grid here.
Next

如果您想更直接一些,这将获取特定 TabControl 的任何 TabPage 上的每个 DataGridView

For Each grid In TabControl1.TabPages.
                             Cast(Of TabPage)().
                             SelectMany(Function(tp) tp.Controls.OfType(Of DataGridView)())
    'Use grid here.
Next

您可以使用 Controls.Find递归 搜索。这将按名称找到控件,无论它在其他控件中的嵌套有多深:

Dim dgvName As String = "dataGridView9001"
Dim dgv As DataGridView = Me.Controls.Find(dgvName, True).FirstOrDefault
If Not IsNothing(dgv) Then
    ' ... do something with "dgv" ...
End If

注意 TrueFind() 调用的第二个参数,告诉它在子项内搜索。