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

查找窗体上的所有控件,甚至是选项卡控件中的控件-VB.net,vb.net,controls,ctype,Vb.net,Controls,Ctype,我有一组DataGridView,它们是在运行时创建的,我需要引用它们以在进行更改时更新它们。 我知道我可以用 Dim dgvUpdate As DataGridView dgvUpdate = CType(Me.Controls(strGridName), DataGridView) 为了获得datagrid,我需要让他们重新运行SQL并重新执行DataGridView.DataSource 但是,这些DataGridView位于任意数量的不同TabControls中的TabPages中,因

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

Dim dgvUpdate As DataGridView
dgvUpdate = CType(Me.Controls(strGridName), DataGridView)
为了获得datagrid,我需要让他们重新运行SQL并重新执行DataGridView.DataSource

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


是否有一种方法可以在代码中引用当前表单中的所有控件,而不考虑选项卡、面板等。我可以在Ctype方法中使用该方法来获取正确的datagridview。

以下是一种方法,您可以使用该方法按选项卡顺序获取表单上的每个控件:

公共迭代器函数GetControls()作为IEnumerable(控件的)
Dim ctrl=GetNextControl(Me,True)
直到ctrl不起作用为止
屈服控制
ctrl=GetNextControl(ctrl,True)
环
端函数
如果要使用它来获取每个
DataGridView

(DataGridView)()类型的GetControls()中的每个网格的
)
“在这里使用网格。
下一个
如果您想更直接,这将获得特定
TabControl
的任何
TabPage
上的每个
DataGridView

TabControl1.TabPages中每个网格的
。
铸造(制表符页)()。
选择many(函数(tp)tp.Controls.Of类型(DataGridView)()
“在这里使用网格。
下一个

以下是一种方法,可用于按制表符顺序获取表单上的每个控件:

公共迭代器函数GetControls()作为IEnumerable(控件的)
Dim ctrl=GetNextControl(Me,True)
直到ctrl不起作用为止
屈服控制
ctrl=GetNextControl(ctrl,True)
环
端函数
如果要使用它来获取每个
DataGridView

(DataGridView)()类型的GetControls()中的每个网格的
)
“在这里使用网格。
下一个
如果您想更直接,这将获得特定
TabControl
的任何
TabPage
上的每个
DataGridView

TabControl1.TabPages中每个网格的
。
铸造(制表符页)()。
选择many(函数(tp)tp.Controls.Of类型(DataGridView)()
“在这里使用网格。
下一个

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

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

请注意
True
调用的
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

请注意
True
调用的
Find()
的第二个参数,告诉它在子对象中搜索。

“我有一组在运行时创建的DataGridView”由于您正在创建这些控件,您可以将它们存储在
字典(字符串的,DataGridView)
中,以便可以很快地再次检索它们?“我有一组在运行时创建的DataGridView”因为您正在创建这些控件,所以您可以将它们存储在
字典(字符串的,DataGridView)中
这样您就可以很快地再次检索它们了?似乎如果您可以存储网格的名称,那么您就可以只存储网格本身,从而使这些代码变得毫无意义。@jmchiliney同意。这就是为什么我将其作为对原始问题的评论。不过,谁知道他们在做什么呢……因为e在编写生成表单的原始代码时,我没有想到这一点。我将试一试。似乎如果你可以存储网格的名称,那么你可以只存储网格本身,从而使这些代码变得毫无意义。@jmchilinney同意。这就是为什么我将其作为对原始问题的评论.谁知道他们在做什么呢…在一个坚果壳中…因为我在编写生成表单的原始代码时没有想到这一点。我会试一试的。谢谢jmcilhinney。我使用了最上面的代码并循环使用,直到找到ctrl.name,直到找到我需要的。谢谢!没有必要循环。如果你想通过
Name
创建控件,然后可以使用类型为(DataGridView的)的
GetControls()().FirstOrDefault(函数(dgv)dgv.Name=someName)
如果您知道名称有效,那么请先使用
来代替,在这种情况下,结果不能是
。也就是说,如果您只需要一个控件的名称,那么请使用另一个答案,因为
Find
已经通过
name
进行了搜索。我的代码是在假设您想要访问所有控件的情况下编写的。正如我在那里评论的那样,为什么要在可以存储网格本身的情况下存储名称呢?我不会在创建名称时存储名称。但是,它们都有一个名称,我可以根据用户所做的选择来创建,然后当更改完成时,会更新正确的DGV以反映这些更改。谢谢JMCILHINEY。我使用了顶部的code和循环,直到找到所需的ctrl.name。谢谢!没有必要循环。如果您希望通过
name
创建一个控件,则可以使用
GetControls().OfType(Of DataGridView)().FirstOrDefault(Function(dgv)dgv.name=someName)
如果您知道名称有效,那么请先使用
来代替,在这种情况下,结果不能是
。也就是说,如果您只需要一个控件的名称,那么请使用另一个答案,因为
Find
已经通过
name
进行了搜索。我的代码是在假设您想要访问所有控件的情况下编写的。正如我在那里评论的那样,为什么要在可以存储网格本身的情况下存储名称呢?我不会在创建名称时存储名称。但是,它们都有一个名称