遍历控件

一般用户可以忽略本节的内容。

遍历控件

所有的控件都是派生自WinForm.Control类型,所以这个类型的变量可以引用任何类型的控件,例如:

Dim c1 As Winform.Control
Dim
c2 As Winform.Control
c1 = e.Form.Controls(
"Button1")
c2 = e.Form.Controls(
"TextBox1"
)

如果要遍历窗口中的所有控件,只能使用WinForm.Control类型的变量,例如:

For Each c As Winform.Control In e.Form.Controls
    c.BackColor = Color.Green

Next

关于派生

前面提到所有控件都是派生自WinForm.Control类型,初学者可能不能理解“派生”的意义。
以汽车作为例子:汽车是最基本的类型,它定义了汽车最基本的属性和方法,然后在汽车这个类型的基础上,派生出轿车、火车、救护车、消防车等类型,这些类型定义继承了汽车这个基本类型的所有属性,同时增加了自己独有的属性和方法。
对于窗口中的控件来说,WinForm.Control是最基本的类型,它定义了作为控件最基本的属性和方法,其它所有控件都派生于这个基本类型,在WinForm.Control的基础上增加了自己独有的属性和方法。
我们很少需要直接使用WinForm.Control类型的变量,而是直接使用WinForm.Button这种直接表明控件类型的变量,因为前者无法访问WinForm.Button专有的属性和方法。

示例:

下面的代码在编译的时候,会提示WinForm.Control没有Value属性:

Dim b As WinForm.Control
b = e.Form.Controls("TextBox1")
b
.BackColor = Color.Red
b
.Value = "123" '这里不能通过编译

如果改用WinForm.TextBox类型的变量,则一切正常:

Dim b As WinForm.TextBox
b = e.Form.Controls(
"TextBox1")
b.BackColor = Color.Red
b.Value =
"123"

这是因为BackColor属性是WinForm.Control类型定义好的,既可以通过WinForm.Control类型的变量访问,也可以通过WinForm.TextBox类型的变量访问,因为后者继承了前者的全部属性和方法。
而Value属性是WinForm.TextBox类型定义的,所以不能通过WinForm.Control类型的变量访问。

唯一的例外就是需要遍历控件的时候,此时只有使用WinForm.Control类型的遍历变量,才能正常引用各种类型的控件;如果你用WinFom.Button这种代表特定控件类型的变量,如果遇到 其它控件类型,例如WinForm.TextBox的时候,肯定要出错。

判断控件类型

如果我希望清除窗口中所有文本框的内容,显然只能使用遍历才能完成这样的任务。
但是遍历控件的时候,只能使用WinForm.Control类型的变量,但是这样的变量又不能访问文本框的Value属性。
所以只能在遍历控件的时候判断控件类型,然后用具体的控件类型变量来引用控件:

For Each c As WinForm.Control In e.Form.Controls
    If
Typeof c Is WinForm.TextBox Then '判断控件是否是文本框
       
Dim t As WinForm.TextBox = c '使用特定类型的变量引用控件
        t.Value =
Nothing
    End
If
Next

判断变量是否是某类型的语法是:

Typeof 变量 Is 类型

如果变量是指定的类型则返回True,否则返回False。

本节介绍的派生原理,不仅适合窗口设计,也适合今后要介绍的菜单设计。


本页地址:http://www.foxtable.com/webhelp/topics/1849.htm