10

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

Private Sub Command1_Click(Index As Integer)

   Text1(Index).Text = Timer

End Sub

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

4

9 回答 9

5

制作一个通用的文本框列表:

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;
}
于 2008-09-02T13:51:33.183 回答
4

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
于 2008-09-02T13:49:00.710 回答
3

.Net中没有真正的1 对 1 模拟。当然,您可以制作特定类型的控件的数组或列表,但没有什么可以自动为您完成。

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

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

于 2008-09-02T14:11:27.583 回答
2

有两个方面。

.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
于 2008-09-02T13:50:54.917 回答
1

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

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

最后,随着泛型的出现,没有什么能阻止你使用

List<YourControl> MyControlArray.
于 2008-09-02T13:50:48.490 回答
0

制作一组控件。

TextBox[] textboxes = new TextBox[] {
    textBox1,
    textBox2,
    textBox3
};
于 2008-09-02T13:45:55.617 回答
0

相同的单击事件可以处理来自 .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
于 2008-09-02T13:54:51.680 回答
0

VB6 中控件数组的两个主要好处是:(1)它们为您提供了一种遍历控件集合的方法(2)它们允许您在控件之间共享事件

(1) 可以在 .Net 中使用一组控件来完成 (2) 可以通过让一个事件处理多个控件来完成(语法略有不同,因为您使用sender参数而不是myArray(index))。

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

于 2010-01-20T05:20:05.400 回答
0

我知道我的答案已经很晚了,但我想我找到了解决方案。我不是唯一一个与 VS 的这种限制作斗争的前 VB6 开发人员。很久以前,我尝试迁移我设计的 CRM,但我失败了,因为我对控制数组有很强的依赖(数百个在一种形式中)。我阅读了很多论坛,并且能够编写这个简单的代码:

VB.NET:

'To declare the List of controls
Private textBoxes As List(Of TextBox) = New List(Of TextBox)()

Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs)
    'To get all controls in the form
    For Each control In Controls

        'To search for the specific type that you want to create the array 
        If control.[GetType]() = GetType(TextBox) Then
            textBoxes.Add(CType(control, TextBox))
        End If
    Next

    'To sort the labels by the ID
    textBoxes = textBoxes.OrderBy(Function(x) x.Name).ToList()
End Sub

C#:

//To declare the List of controls
private List<TextBox> textBoxes = new List<TextBox>();
private void Form1_Load(object sender, EventArgs e)
{
    //To get all controls in the form
    foreach (var control in Controls)
    {
        //To search for the specific type that you want to create the array 
        if (control.GetType() == typeof(TextBox))
        {
            //To add the control to the List
            textBoxes.Add((TextBox)control);
        }
    }

    //To sort the labels by the ID
    textBoxes = textBoxes.OrderBy(x => x.Name).ToList();
}

有3点需要考虑:

  1. AList将帮助您模拟大量控件。
  2. typeof(Control)将帮助您定义要添加到列表中的控件类型。
  3. 当您将“索引”保留为最后一个字符(textBox 1、 textBox 2、...、textBox N时,您可以创建逻辑顺序。

设计模式示例:

一个窗口中的多个文本框

跑步:

运行示例

在我看来,类似的逻辑可能会在 WPF、ASP.NET(Web 窗体)或 Xamarin(窗体)等其他技术中使用。我希望这段代码将来能帮助更多的程序员。

于 2019-08-06T09:18:02.900 回答