在VB.NET中创建控件数组

3

如何制作控件数组?或者它的等效方式。

我习惯于使用Visual Basic 6,当我复制和粘贴控件时,它会提供创建控件数组的选项。


我记不清了,控件数组是用来动态地向表单添加新控件的吗?这是你想要实现的目标吗? - MikeG
5个回答

6

控件数组已经过时。现在,面向对象的方法是VB的法律。

您需要使用某种集合,例如列表


2
控件数组的另一个隐式特征容易被忽视,那就是将数值索引与数组中的每个元素关联起来。 索引可以是任何正整数,只要它们在集合中是唯一的即可,它们不必是连续的。 因此,该数组更像是一个由整数索引的字典,其中每个项值都是特定类型控件的实例。
VB6事件处理程序中的逻辑获取索引的值以及要处理的事件的属性。 处理程序中的逻辑通常使用索引来确定哪个控件实例引发了事件。
.NET事件处理程序有所不同。 您通常会得到对特定控件实例的引用以及事件对象的特定实例,该实例具有要处理的事件的属性。 您将不会得到索引。
此外,VB6应用程序有时具有将控件数组作为数组进行迭代/操作的逻辑。
在我们的默认翻译中,我们尝试支持显式依赖于控制数组及其索引的遗留VB6逻辑。 我们将控件数组重写为一组单独的控件实例,然后在表单初始化期间将它们添加到通用OrderDictionary<int,controlType>中。 单个控件订阅事件,我们可以使用集合查找给定控件实例的索引,或迭代/操作“数组”中的项目。 如果您不需要显式使用索引或数组,则可以摆脱集合。
动态添加控件现在需要更多工作-在VB6中,它在概念上类似于将项目添加到控件数组中,并且通过单个语句(Load control)支持。 据我所知,在.NET中,您需要克隆控件,显式深复制属性,并显式连接事件处理程序。 它可以使用反射和其他中等级别的技术进行泛化-但肯定不是简单地调用“load control”。 如果在.NET中有更简单的方法,请告诉我们。 对于我们的翻译,我们会转换为帮助器函数。

0

创建控件数组有三种方法:

  1. 将多个控件赋予相同的名称。
  2. 复制一个现有的控件并将其粘贴到表单中。
  3. 将索引正确设置为非空值。

0
在VB6中,控件数组的唯一存在是为了允许一个单一的事件处理程序来处理多个相同类型的控件。
在VB.NET中,您可以通过将控件放入“Handles”子句中来实现此功能:
private sub Button_Click(...) Handles Command1.Click, Command2.Click, Command3.Click

end sub

2
不仅如此,它们还允许您在一个窗体上放置超过256个控件。 - Kaniu
@Kaniu 不一定。您可以使用“Controls.Add”来完成相同的操作,而无需创建控件数组。 - GSerg
只有在您想要(并且能够)在运行时添加控件时才可以这样做。但是,如果有十几个选项卡页面充满了控件,那可能不是一个真正的选择。 - Kaniu

0

你只能通过代码来实现行动。例如:

Dim c() As TextBox
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    Dim j As Integer
    For j = 0 To 10
        ReDim Preserve c(j)
        c(j) = New TextBox
        c(j).Name = "txt" & j
        c(j).Parent = Me
        c(j).Top = j * c(j).PreferredHeight + 2
        c(j).Tag = j
        c(j).Visible = True
        AddHandler c(j).KeyPress, AddressOf TestKeyPress
    Next
End Sub

Public Sub TestKeyPress(source As Object, e As KeyPressEventArgs)
    Dim index As Integer
    index = CInt(source.tag)
    If index >= 5 Then
        If e.KeyChar > "9" Or e.KeyChar < "0" Then
            e.Handled = True
        End If
    Else
        If e.KeyChar <= "9" And e.KeyChar >= "0" Then
            e.Handled = True
        End If
    End If
End Sub

这将创建十一个文本框,并分配给它们相同的事件处理程序。

TAG 属性用于存储和检索文本框的索引。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接