也许我还不太了解.NET,但我还没有看到一种令人满意的方法来在.NET中轻松实现这个简单的VB6代码(假设此代码位于数组Command1中带有N个CommandButtons的表单上( )和数组Text1()中的N个TextBox:
Private Sub Command1_Click(Index As Integer)
Text1(Index).Text = Timer
End Sub
我知道它不是非常有用的代码,但它证明了VB6中控件数组的易用性。 C#或VB.NET中最简单的等价物是什么?
答案 0 :(得分: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;
}
答案 1 :(得分: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
答案 2 :(得分:3)
.Net中没有真正的 1对1模拟。当然,您可以制作特定类型的控件的数组或列表,但没有什么可以自动为您做到这一点。
但是,我从来没有见过无法在.Net中重构的控件数组更好。一个典型的例子是你的例子。在您发布的场景中,您使用控件数组将按钮与文本框配对。在.Net中,您可能会使用自定义控件执行此操作。自定义控件将包含一个按钮,一个文本框,以及一个共享/静态计时器。该表单使用此自定义控件的多个实例。你实现了控件所需的逻辑一次,它与它自己的源文件隔离,可以在源代码控制中跟踪和编辑,无需与更大的表单类合并,或者在多个表单甚至多个项目中轻松重用。您也不必担心确保命令按钮索引与文本框索引匹配。
对此使用自定义控件而不是控件数组与使用类对数据而不是数组进行分类非常类似,因为您获取的是名称而不是索引。
答案 3 :(得分: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
答案 4 :(得分:1)
VisualBasic .NET的兼容性库包含强类型控件数组。这是升级向导用于替换当前VB6控件数组的内容。
然而,VB6中的控件数组只是一个对象的集合,VB6在表面上做了一些语法魔术。在.NET世界中,通过删除它,它们正在强制实施更好的实践。
最后,随着泛型的出现,没有什么可以阻止你使用
List<YourControl> MyControlArray.
答案 5 :(得分:0)
制作一系列控件。
TextBox[] textboxes = new TextBox[] {
textBox1,
textBox2,
textBox3
};
答案 6 :(得分: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
答案 7 :(得分:0)
VB6中控制数组的两个主要优点是: (1)它们为您提供了一种迭代控件集合的方法 (2)他们允许您在控件之间共享事件
(1)可以使用一系列控件在.Net中完成
(2)可以通过让一个事件处理多个控件来实现(语法稍有不同,因为你使用sender
参数而不是myArray(index)
)。
.Net的一个好处是这些功能是分离的。因此,例如,即使它们不是数组的一部分,并且具有不同的名称甚至是不同的类型,您也可以拥有共享事件的控件。即使他们有完全不同的事件,你也可以遍历一系列控件。
答案 8 :(得分: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点需要考虑:
List
将帮助您模拟大量控件。typeof(Control)
将帮助您定义要添加到列表中的控件的类型。设计模式下的示例:
运行:
在我看来,类似的逻辑可能会用于WPF,ASP.NET(Web窗体)或Xamarin(窗体)等其他技术中。我希望这段代码将来可以帮助更多的程序员。