也许我对 .NET 还不够了解,但我还没有看到一种令人满意的方法来在 .NET 中轻松实现这个简单的 VB6 代码(假设此代码位于数组 Command1() 中包含 N 个 CommandButtons 和 N 个 CommandButtons 的表单上)数组 Text1()) 中的文本框:

Private Sub Command1_Click(Index As Integer)

   Text1(Index).Text = Timer

End Sub

我知道这不是很有用的代码,但它演示了在 VB6 中使用控制数组的简便性。C# 或 VB.NET 中最简单的等价物是什么?

有帮助吗?

解决方案

制作文本框的通用列表:

var textBoxes = new List<TextBox>();

// Create 10 textboxes in the collection
for (int i = 0; i < 10; i++)
{
    var textBox = new TextBox();
    textBox.Text = "Textbox " + i;
    textBoxes.Add(textBox);
}

// Loop through and set new values on textboxes in collection
for (int i = 0; i < textBoxes.Count; i++)
{
    textBoxes[i].Text = "New value " + i;
    // or like this
    var textBox = textBoxes[i];
    textBox.Text = "New val " + i;
}

其他提示

VB .NET 所做的另一件好事是拥有一个处理多个控件的事件处理程序:

Private Sub TextBox_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) _ 
        Handles TextBox1.TextChanged, _

        TextBox2.TextChanged, _

        TextBox3.TextChanged

End Sub

没有 真实的 .Net 中的 1 对 1 模拟。当然,您可以创建特定类型的控件数组或列表,但没有任何东西可以自动为您执行此操作。

但是,我从未见过无法在 .Net 中将其重构为某种内容的控制数组 更好的. 。你的例子就是一个典型的例子。在您发布的场景中,您使用控制数组将按钮与文本框配对。在 .Net 中,您可能会使用自定义控件来完成此操作。自定义控件将包含一个按钮、一个文本框,可能还包括一个共享/静态计时器。该表单使用此自定义控件的多个实例。您一次实现控件所需的逻辑,并将其隔离到它自己的源文件,可以在源控件中跟踪和编辑该源文件,而无需与较大的表单类合并,或者可以轻松地在多个表单甚至多个项目中重复使用。您也不必担心确保命令按钮索引与文本框索引匹配。

为此使用自定义控件而不是控件数组与使用类而不是数组对数据进行分组大致相似,因为您获得的是名称而不是索引。

有两个方面。

.NET 很容易支持控件数组,VB6 只需要使用一种解决方法,否则连接事件真的很困难。在 .NET 中,动态连接事件很容易。

然而,.NET 表单设计器不支持控件数组,原因很简单:控件数组在运行时创建/扩展。如果您知道在编译时需要多少个控件(推理是这样的),那么您可以为它们指定不同的名称,并且不要将它们放入数组中。

我知道这不是很有用的代码

这正是重点。如果一个功能没有用,为什么还要有这个功能呢?

如果需要,您还可以通过名称访问控件,结果如下:

Private Sub Command_Click(sender As Object, e As EventArgs) Handles Command1.Click, Command2.Click …
    Dim name As String = DirectCast(sender, Control).Name
    Dim index As Integer = Integer.Parse(name.Substring("Command".Length))
    Controls(String.Format("Text {0}", index)).Text = Timer.Value.ToString()
End Sub

VisualBasic .NET 的兼容性库包含强类型控制数组。这就是升级向导用来替换当前 VB6 控制阵列的内容。

然而,VB6 中的控件数组只是对象的集合,VB6 在表面上做了一些语法魔术。在 .NET 世界中,通过删除这一点,他们正在强制推行更好的实践。

最后,随着泛型的出现,没有什么可以阻止您使用

List<YourControl> MyControlArray.

制作一系列控件。

TextBox[] textboxes = new TextBox[] {
    textBox1,
    textBox2,
    textBox3
};

相同的单击事件可以处理 .Net 中多个按钮的按下事件。然后您可以添加要在 Tag 属性中查找的文本框吗?

Private Sub AllButton_Click(sender As Object, e As EventArgs) Handles Button1.Click, Button2.Click, Button3.Click
  Dim c As Control = CType(sender, Control)
  Dim t As TextBox = FindControl(CType(c.Tag, String))
  If t Is Not Nothing Then
     t.Text = "Clicked"
  End If
End Sub

VB6 中控制数组的两个主要优点是:(1)他们为您提供了通过一系列控件(2)允许您在控件之间分享事件的方法

(1)可以在.NET中使用一个控件(2)来完成。 sender 论证而不是 myArray(index)).

.Net 的一大优点是这些功能是解耦的。例如,您可以拥有共享事件的控件,即使它们不是数组的一部分并且具有不同的名称甚至不同的类型。即使控件具有完全不同的事件,您也可以迭代它们的集合。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top