在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
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 按钮")
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⾥⾯的动态控件数组的问题,这个动态控件数组在vb⾥⾯easy到极致,可是在vb⾥⾯却有点让⼈摸不着头脑。
其实也很简单,因为vb和vb不同拉,来看看vb的动态控件数组如何实现。
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.
....
'下⾯这个地⽅注意拉,
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中的控件数组。
如果你要为控件数组定义其他的触发事件,只要修改对应的触发就可以了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论