【问题标题】:Find all controls on a form, even those within Tab Controls - VB.net查找表单上的所有控件,甚至是选项卡控件中的控件 - VB.net
【发布时间】:2021-03-02 22:33:46
【问题描述】:

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

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

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

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

有没有一种方法能够在代码中引用当前表单中的所有控件,无论选项卡、面板等如何,我都可以在 Ctype 方法中使用它来获取正确的 datagridview。

【问题讨论】:

  • "我有一组在运行时创建的 DataGridViews" 由于您正在创建这些控件,您可以将它们存储在 Dictionary(Of String, DataGridView) 中,这样您就可以很快地再次检索它们?跨度>

标签: vb.net controls ctype


【解决方案1】:

这是一种方法,您可以使用它来按 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

【讨论】:

  • 感谢 jmcilhinney。我使用最上面的代码并循环遍历,直到找到 ctrl.name 直到找到我需要的那个。谢谢!
  • 无需循环。如果您想要Name 的一个控件,那么您可以使用GetControls().OfType(Of DataGridView)().FirstOrDefault(Function(dgv) dgv.Name = someName)If you know the name is valid then use First` 代替,在这种情况下,结果不能是 Nothing。也就是说,如果您只想按名称控制一个控件,请改用另一个答案,因为Find 已经通过Name 进行了搜索。我的代码是假设您想访问所有这些代码而编写的。正如我在那里评论的那样,当您可以存储网格本身时,为什么还要存储名称?
  • 我不会在创建名称时存储它们。但是,它们都有一个名称,我可以根据用户做出的选择来构建它,然后在完成更改后更新正确的 DGV 以反映这些更改。
【解决方案2】:

您可以使用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

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

【讨论】:

  • 看来,如果你可以存储网格的名称,那么你可以只存储网格本身,而使这样的代码毫无意义。
  • @jmcilhinney,同意。这就是为什么我把它作为对原始问题的评论。不过谁知道他们在做什么....
  • 简而言之......因为在编写生成表单的原始代码时我没有想到这一点。不过我会试一试的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多