【问题标题】:How do I iterate through Components on a Windows Form?如何遍历 Windows 窗体上的组件?
【发布时间】:2016-11-16 15:25:04
【问题描述】:

我在使用 VB.NET 中的 .NET Compact Framework 3.5 的系统上使用 VisualStudio 2008,并且有一个包含几个组件的表单,即计时器和消息框。我的应用程序的一部分是一个子程序,它遍历表单中的所有控件并调整 Front 或 BackColor 等属性,以便我们可以按需重新设计整个应用程序。

在遍历这些控件时,我还想遍历组件并在表单上设置消息框的一些属性。我尝试使用 For Each 访问 Me.components.Components 但该集合似乎是私有的。

For Each comp As Object in Me.components
  <do something>
Next comp

有没有办法遍历组件?

编辑:

我错误地认为 me.components.Component 是私有的。使用Me.components.Components 我得到以下错误:

“组件”不是“System.ComponentModel.IContainer”的成员。

【问题讨论】:

  • A MessageBox 既不是组件也不是控件。这是一个仅在您调用MessageBox.Show() 时创建的对话框。您很可能无法使用 .NET 代码找到它。它宁愿要求对例如 WinAPI 的 EnumWindows() 函数执行平台调用。
  • 经过一番挖掘后,我发现在 Compact Framework 中,组件实际上与表单本身并不相关。不过,它们仍然可以在其他地方找到,请参阅以下两个答案:[ 1 ][ 2 ]

标签: vb.net visual-studio-2008 .net-cf-3.5


【解决方案1】:

你可以用这个循环遍历计时器: ....

For Each c As Object In Me.components.Components
        If TypeOf c Is Timer Then
            Dim tim As Timer = CType(c, System.Windows.Forms.Timer)
            tim.Interval = 12345
        End If
    Next

.Interval = 12345 更改为您想要对计时器执行的操作。

....并通过其他控件:

For Each ctrl As Control In Me.Controls
        If (ctrl.GetType() Is GetType(TextBox)) Then
            Dim txt As TextBox = CType(ctrl, TextBox)
            txt.BackColor = Color.LightYellow
        End If
    Next

用控件类型更改TextBox

还有.BackColor = Color.LightYellow 与您想对控件进行的任何操作。

不幸的是,我不知道如何使用 MesseageBoxes :(

【讨论】:

  • I've tried using a For Each to access Me.components.Components but that collection appears to be private. *Ahem* *ahem*? :)
  • Me.components 是私有的。 Me.components.Components 不是。如果这不起作用,第二个会起作用。
  • ...只是您的第二个代码不包含组件。我只是问,因为我是用手机写的,因此我无法测试任何东西。无论哪种方式,Me.components 可能是私有的,但由于Me 是表单,访问它没有问题(就像你说的那样)。 :)
  • Me.components 不起作用但它不是私有的,它没有被声明
  • 没有声明??你在说什么? -- 另外,你找不到MessageBox 这个。为此,您很可能必须查阅 P/Invocation 和 WinAPI。 :)
猜你喜欢
  • 1970-01-01
  • 2021-06-24
  • 1970-01-01
  • 2022-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
  • 2011-05-21
相关资源
最近更新 更多