在VB.NET中使用控件数组
控件数组是位于一个窗体上共享同一名称的一组同种类型控件。普通控件仅使用名称就可以识别,而引用控件数组中的成员则需要同时使用名称和索引。开发人员在 Visual Basic 6.0 以及更早的版本中使用控件数组主要有以下三个理由:
1. 在循环中访问数组中控件的属性。
2. 向窗体动态添加新控件。
3. 允许一个事件例程与多个控件连接 。
控件数组的使用,极大的方便了开发人员。然而,刚刚从Visual Basic6.0(以下简称VB6.0)过渡到Visual Basic.Net(以下简称VB.NET)的初学者却发现,在VB.NET中似乎不能使用控件数组了。笔者仔细查阅了VB.NET的MSDN文档发现,在 VB.NET 中,确实不再支持控件数组。原因是,VB.NET对事件模型作了很大的改动,引入了另外一种数据类型――控件集合模型,使控件数组没有存在的必要。就像 VB6.0 中的控件数组可以共享事件一样,VB.NET 中的事件模型允许任何事件处理程序都可以处理来自多个控件的事件,这就允许创建属于不同类型但共享相同事件的控件组。
所谓控件集合是指包含在一个容器中的所有控件的总和,能够创建控件集合的容器有:Form、Panel、GropBox等。程序运行时,可以通过访问容器的Control属性来得到该容器中的所有控件。
下面将演示如何通过控件集合来使用控件数组:
一、 直接使用Form容器的控件集合来使用控件数组:
建立一个VB.NET项目,在Form1中添加三个TextBox控件,名称分别为:TextBox1、TextBox2、TextBox3,一个Button控件。
双击Button,输入如下代码:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ‘下面的语句是通过数组元素的下标来访问Form中的每一个元素。 Me.Controls.Item(0).Text = "集合中的第一个元素" Me.Controls.Item(1).Text = "集合中的第二个元素" Me.Controls.Item(2).Text = "集合中的第三个元素" Me.Controls.Item(3).Text = "集合中的第四个元素" End Sub
运行项目后,点击Button,看到的结果是:Form1中的所有控件(包括Button自己)的Text属性都被修改了,同时还发现,最后加入的的控件变成了集合中的第一个元素(下标为0)。这个结果说明:
Form1中的所有控件已经自动构成了一个控件集合(控件数组),这个特点使得建立控件数组变得非常简单。
在访问这些控件时,除了可以通过控件名称直接访问外,还可以通过Contro.Item(n)属性按下标访问集合中的每一个控件;
集合中控件的类型可以不相同,这点和VB6.0完全不同;
集合中的下标顺序是按照加入控件的顺序倒排的;
VB.NET中控件数组的特点让人稍感不适的是,控件数组的下标是按加入顺序的倒排续产生的,但程序员完全可以改变这个顺序:在代码编辑窗中点击“#Region " Windows 窗体设计器生成的代码”旁边的“+”号,代码展开后,找到如下代码:
Me.Controls.Add(Me.Button1)
Me.Controls.Add(Me.TextBox3)
Me.Controls.Add(Me.TextBox2)
Me.Controls.Add(Me.TextBox1)
这个代码顺序就是控件数组的下标顺序,只要改变这个顺序就可以改变控件数组中每个以元素的下标。
在Form中构成控件数组非常方便,但也有一个小问题:一般来说,Form中的控件往往有很多种,系统建立控件集合的时候将会把其中的所有控件放在同一个集合中,这样一来,程序员在写代码的时候有可能将每一个控件的下标混淆,为了解决这个问题,可以用Panel容器来根据需要将某类控件建立成控件数组,也就避免了上述问题。
建立的方法非常简单:只需要在Form中添加一个Panel控件,然后将需要建立控件数组的控件加入其中即可,然后用:Panel.Control.Item(n)来访问其中的每一个控件。
二、 用代码建立控件集合。
建立一个VB.NET项目,在Form中添加三个TextBox和一个Button控件,在代码编辑窗口中输入如下代码:
Dim TextboxArray As New ArrayList ‘定义一个数组例表 Private Sub BiuldTextBoxArray() ‘过程用来将Form上的三个TextBox加入到数组例表中 TextboxArray.Add(TextBox1) TextboxArray.Add(TextBox2) TextboxArray.Add(TextBox3) End Sub
‘让Form在启动的时候将三个TextBox控件加入到数组例表中,构成控件数组。
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load BiuldTextBoxArray() End Sub
‘编写Button点击事件代码,利用控件数组访问三个TextBox控件
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click TextboxArray(0).text = "文本框第一个元素" TextboxArray(1).text = "文本框第二个元素" TextboxArray(2).text = "文本框第三个元素" End Sub
运行工程,点击Button,发现三个TextBox都被修改了,效果和前面的方法一样。
三、 在程序中动态添加控件数组。
前面定义的控件数组都是在设计阶段完成的,它要求,控件数组中的控件数量必须已知,也叫静态控件数组;但很多时候要求,控件数组中的控件数量要用程序的某些运行情况来确定,这就要求,控件数组中的控件要能实现动态添加。
建立一个VB.NET工程,在Form上添加两个Button,其中,Button1用来添加动态控件数组;Button2用来修改数组中每个控件的属性。
在代码编辑窗口中输入如下代码:
Dim List As New ArrayList ‘定义一个例表对象,用来集合数组控件 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim i As Integer For i = 0 To 4 ‘利用循环语句动态加入控件数组。 Dim FirstTextBox As New TextBox ‘定义文本框对象 Me.Controls.Add(FirstTextBox) ‘将一个文本框控件加入到Form上 List.Add(FirstTextBox) ‘将文本框控件加入到例表集合中 List.Item(i).top = i * List.Item(i).height + 20 ‘修改新加入控件在Form上的位置 List.Item(i).left = 100 FirstTextBox.TabIndex = i ‘修改新加入控件的TabIndex值 List.Item(i).text = "TextBox" & i.ToString ‘修改默认文本。 Next End Sub
用循环来访问动态控件数组中的控件。
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim i As Integer For i = 0 To 4 List.Item(i).text = "第 " & i.ToString & " 个元素" Next End Sub
运行项目,先点击Button1,Form上将出现5个文本框,然后再点击Button2,修改这五个文本框的Text属性。
从这个实例看出,VB.NET中动态加入控件数组与在VB6.0中实现动态数组有一个显著的不同:VB6.0中必须要有一个静态的“控件种子”,而在VB.NET中已经不需要了。
四、 控件数组的事件响应。
控件数组的最重要的特色之一就是让一组控件响应同一个事件,在事件例程中接收控件具体某控件的Index值来分别处理处理具体问题,这点已经在VB6.0中表现得淋漓尽致了,它在VB.NET中同样可以实现,只不过实现方式有了变化。由于在容器中的每一个控件只要不作特殊处理,都会自动构成了控件集合,这样,只要对原有的事件例程作少量修改,就可以非常方便的实现用一个事件例程响应某个集合中所有控件产生的事件。
下面演示实现用同一个例程来处理两个Button和一个TextBox发出的Click事件。
建立一个VB.NET项目,在Form上添加两个Button,和一个TextBox。
在代码编辑窗口中点击“#Region " Windows 窗体设计器生成的代码”旁边的“+”号,代码展开后,找到如下代码并调整为下面的顺序:
Me.Controls.Add(Me.TextBox1)
Me.Controls.Add(Me.Button1)
Me.Controls.Add(Me.Button2)
输入如下代码:
Private Sub mControl_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click, TextBox1.Click Select Case sender.tabindex Case 0 MessageBox.Show("你点击了 Button1 按钮") Case 1 MessageBox.Show("你点击了 Button2 按钮") Case 2 MessageBox.Show("你点击了 TextBox1 按钮") End Select End Sub
在这段 代码中:Private Sub mControl_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click, TextBox1.Click 是一个自定义事件,在Handles后面的语句表示:该例程将响应Button1, Button2, TextBox1控件发出的Click事件,如果还有其他控件,也可以放在后面,每一个控件名称用“,”号隔开。
运行项目,分别点击Form上面的三个控件就能体会到它的用法。
====================
vb.net里面的动态控件数组的问题,这个动态控件数组在vb里面easy到极致,可是在vb.net里面却有点让人摸不着头脑。
其实也很简单,因为vb.net和vb不同拉,来看看vb.net的动态控件数组如何实现。
1、在form的头部定义一个公共的ArrayList类型的变量
Dim m_items As New ArrayList
2、在程序中动态生成控件
while (a<b)
dim lblControl as Label= new Label
lblControl .Text="你好"
lblControl .dock=......top
lblControl .autosize=false.
....
me.controls.add(lblControl )'把动态产生的控件放到对应的区域
'下面这个地方注意拉,
m_items.Add(lblControl )'把这个label放到前面第一步定义的ArrayList中去
AddHandler label.Click, AddressOf LblControlArrayClick '给这组动态控件定义click事件的触发函数LblControlArrayClick 。
end while
3、定义LblControlArrayClick 的click事件的触发函数,这个是和vb不同的地方的关键所在拉。
'控件数组事件
Private Sub LblControlArrayClick (ByVal sender As Object, ByVal e As EventArgs) Dim lblText As String lblText = CType(sender, Label).Text '这里CType就是将触发事件的对象还原为Label对象, '有点像java里面的集合阿,放进去后再取出来的时候,要造型一下。 msgbox ("所电击的动态控件的文字是:" & lblText) end sub
好啦,就是这么简单,vb.net中的控件数组。
如果你要为控件数组定义其他的触发事件,只要修改对应的触发就可以了。