VB6控件数组在.NET中如何实现?

4
在.NET中支持控件数组吗?我们正在讨论将遗留的VB6应用程序转换为.NET。该应用程序有很多控件数组。我已经阅读了不同的文章,这些文章在.NET是否支持控件数组方面存在差异。
有人能给我一个明确的答案吗?.Net是否像VB6一样支持控制数组?这是针对最新版本的.NET 4.0吗?还是有版本限制?
此外,如果可能的话,这是直接转换吗?如果不是,那么要实现这个目标需要什么额外的努力?

请参阅以下近似重复的内容:http://stackoverflow.com/questions/5497403/control-array-in-vb-net 和 http://stackoverflow.com/questions/5497403/control-array-in-vb-net - MarkJ
VB6转VB.Net很少是一次直接的转换,有很多关于“vb6-migration”标签上的火圈讨论。在接近这些火圈之前(或阅读一些帖子之前),您可能希望订购一些防火内衣 :( - MarkJ
4个回答

3

VB.NET对控件数组没有问题。唯一缺少的是设计器不支持它们。可以通过代码轻松解决。像这样:

Public Class Form1
    Private TextBoxArray() As TextBox

    Public Sub New()
        InitializeComponent()
        TextBoxArray = New TextBox() { TextBox1, TextBox2, TextBox3 }
    End Sub

End Class

1
只是谜题的一部分。原帖作者还需要统一的事件处理程序。 - MarkJ

2

我注意到这篇文章是写在'03年的。我想象4.0也支持这个吧? - webdad3
1
+1 这是一篇好文章。现在已经是2011年了,一个明显的改进是使用泛型。与为每种控件类型创建新类不同,可以有一个通用类来完成大部分工作。也许可以有一个通用的 BaseControlArray(Of T),它继承自 List(Of T),而不是像文章中那样继承自 CollectionBase。然后 ButtonArray 将继承 BaseControlArray(Of Button) 并公开事件,这些事件将根据控件类型而异。 - MarkJ
此外,Microsoft.VisualBasic.Compatibility 库包括一些控件数组的替代品,但它已在 .Net 4 中被删除,因此您可能希望避免使用它。它是由 Microsoft 的 VB6 -> VB.Net 升级向导自动使用的,但该向导已在 VS2010 中被删除。在撰写该文章时的2003年,Microsoft.VisualBasic.Compatibility 并未包含这些替代品 - 现在该库已被删除,那篇文章看起来又有用了! - MarkJ
当你说“你可能希望避免它”时,你是指兼容库、.Net 4还是控件数组? - webdad3

1

你可以拥有控件数组,但它们不像 VB6 中的控件数组那样内置。但是,你可以创建控件数组或类似于 VB6 的统一事件处理程序。


0

我认为我找到了解决方案,我不是唯一一个曾经遇到这个限制的VB6开发人员。很久以前,我尝试迁移软件,但失败了,因为它对控件数组有严格的依赖性。我阅读了许多论坛,并能够编写出这段简单的代码:

Public Class Form1

'To declare the List of controls
Dim labels As New List(Of Label)()

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    'To get all controls in the form
    For Each control In Me.Controls
        'To search for the specific type that you want to create the array 
        If control.[GetType]().Name.Contains("Label") Then
            'To add the control to the List
            labels.Add(DirectCast(control, Label))
        End If
    Next
    'To sort the labels by the ID
    labels = labels.OrderBy(Function(x) x.Name).ToList()
End Sub
End Class

出于方便的原因,我使用了一个列表,但是通过这段代码,您可以在设计时创建所需的控件,并将“索引”保留为最后字符(label1,label2,...,labelN

Many labels in a window form

稍后,您可以使用循环迭代它们,并在眨眼之间将它们添加。接下来,您将能够通过标签(0)、标签(1)等从对象中操作它们。

我希望这段代码能够帮助更多的程序员在未来。


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