动态获取控件的名称和属性



我有 10 个 TrackBar1 TrackBar2、TrackBar3 .....轨道栏10.我想要的是如何操纵它。

我在访问跟踪栏控件属性最小值、最大值、值时遇到问题....

For i = 1 to 10
' its OK
Me.Controls("TrackBar" & i.ToString("0")).Text = "Test1"
' Error -Min is not a member "System.Windows.Forms.Control"
Me.Controls("TrackBar" & i.ToString("0")).Min = 10      
Next

当您为Controls集合编制索引时,您将获得一个Control引用。该集合可以存储任何类型的控件,因此它们唯一的共同点是它们继承Control类。 这意味着您可以直接访问Control类的任何成员。TextControl类的成员,因此可以直接访问Text属性。 任何比该更具体的成员都需要强制转换为更具体的类型才能访问它们。 如果要访问TrackBar类的成员,则需要类型为TrackBar而不是类型Control的引用,这意味着强制转换为该类型。

Dim c = Me.Controls("TrackBar" & i)
Dim t = DirectCast(c, TrackBar)

为了解释选角,我总是以带宠物去看兽医为例。 兽医可以治疗所有类型的动物,但是,当您带宠物时,它是一种特定类型的动物。 当你向兽医展示一个盒子时,他们只知道里面有一只动物,所以他们只知道他们能为它做的事情适用于所有动物。 一旦你把你的宠物从盒子里拿出来,他们看到它是什么类型的动物,他们就会知道他们可以做所有特定于该类型动物的事情。 您的宠物并没有神奇地从一种类型变成另一种类型,但兽医现在知道它可以为它以及一般人做的所有具体事情。

这就是编程中的选角的工作原理。 您的TrackBar始终是一个TrackBar但是,由于它最初是通过Control引用访问的,因此编译器只知道它可以使用它执行所有控件通用的操作。 强制转换通知编译器特定类型,以便编译器知道它可以对特定于该类型执行操作。

避免显式强制转换的一种选择是首先获取TrackBars

For Each tb In Me.Controls.OfType(Of TrackBar)()
'Use tb here.
Next

OfType方法将筛选出所有不属于指定类型的项,并将返回指定类型的引用,因此tb该代码中的类型TrackBar。 在这种情况下,您必须使用For Each循环,因此您对访问项目的顺序的控制较少。 它们将根据表格上的 z 顺序返回。 这意味着,如果您按升序数字顺序添加它们(这似乎很有可能(,并且没有更改 z 顺序,您仍将按升序数字顺序返回它们。

相关内容

  • 没有找到相关文章

最新更新