【问题标题】:vb.net Find all child controls in a winformvb.net在winform中查找所有子控件
【发布时间】:2023-03-10 13:54:01
【问题描述】:

我有一个 win 表单应用程序,其中一个表单在不同的容器 (FlowLayoutPanels) 和 ToolStrip 控件中有许多控件。我需要在表单(和容器)中找到所有子控件。下面的递归函数在一定程度上起作用,但是在 ToolStrip、MenuStrip 和类似的控件项(按钮、标签、组合框等)中找不到子元素。

Public Sub FindChildren(ByVal parentCtrl As Control, ByRef children As List(Of Control))
  If parentCtrl.HasChildren Then
    For Each ctrl As Control In parentCtrl.Controls
      children.Add(ctrl)
      Call FindChildren(ctrl, children)
    Next ctrl
  End If
End Sub

对如何枚举 ToolStrip 项目有何建议?

【问题讨论】:

  • 不能是控件列表属性中的控件。看起来他们将其抽象为工具条的一个特殊部分,称为 ToolStripItem,它不是从 Control 派生的。
  • ToolStripItems 是特殊的,它们不是从 Control 派生的。所以你不能那样找到它们,你为什么需要它来工作并不明显。
  • @HansPassant 感谢您提供的信息。长话短说,我试图在计算过程中禁用某些 ToolStripItems。最终,我将提出禁用 ToolStrip 的解决方案。

标签: vb.net winforms


【解决方案1】:

您可以将列表更改为对象列表并使用以下代码:

Public Sub FindChildren(ByVal parentCtrl As Control, ByRef children As List(Of Object))
    If parentCtrl.HasChildren Then
        For Each ctrl As Control In parentCtrl.Controls
            If TypeOf ctrl Is ToolStrip Then
                Dim toll As ToolStrip
                toll = ctrl
                For Each item In toll.Items

                    children.Add(item)
                Next item

            End If
            children.Add(ctrl)
            Call FindChildren(ctrl, children)
        Next ctrl
    End If

End Sub

【讨论】:

  • @RicardoEguia 感谢您的回答。它解决了这个问题。我已经更新了我的问题,因为我忘了提及 MenuStrip 项目。我会接受你的回答。我只是不知道为什么(以及谁)禁用了这个问题?!这是一个合理的问题,并在几分钟内提供了两个有用的答案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-01
  • 1970-01-01
  • 2021-03-02
  • 2019-12-12
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多