我正在编写一些VB.Net代码来从一个数组中填充Windows窗体上的文本和图片框,但这似乎是一种相当低效的处理方式:
Item1_TB.Text = FormatCurrency(Items(0).Item_Cost, 2)
Item2_TB.Text = FormatCurrency(Items(1).Item_Cost, 2)
Item3_TB.Text = FormatCurrency(Items(2).Item_Cost, 2)
Item4_TB.Text = FormatCurrency(Items(3).Item_Cost, 2)
Item5_TB.Text = FormatCurrency(Items(4).Item_Cost, 2)
Item6_TB.Text = FormatCurrency(Items(5).Item_Cost, 2)
Item1.Image = Image.FromFile(Items(0).Item_Image)
Item2.Image = Image.FromFile(Items(1).Item_Image)
Item3.Image = Image.FromFile(Items(2).Item_Image)
Item4.Image = Image.FromFile(Items(3).Item_Image)
Item5.Image = Image.FromFile(Items(4).Item_Image)
Item6.Image = Image.FromFile(Items(5).Item_Image)
有什么方法可以将它放在for循环中并使用类似的东西:
Item[i]_TB.Text = FormatCurrency(Items(i).Item_Cost, 2)
Item[i].Image = Image.FromFile(Items(i).Item_Image)
答案 0 :(得分:1)
您可以遍历父控件中的所有控件。不知道那是你的表格或小组还是那样的。
dim tb as textbox
dim i as integer
for each o as object in me.controls
if typeof(o is textbox) then
tb = ctype(o,textbox)
i = tb.name.substring(4,1)
tb.Text = FormatCurrency(Items(i).Item_Cost, 2)
end if
next
答案 1 :(得分:0)
将所有控件放在类似的数组中允许循环。
可以使用这样的格式......
Dim ctls() as control={Item1_TB, Item2_TB, etc... }
For iQ as integer = 0 to ubound(ctls)
ctls(iQ).Text = .FormatCurrency(Items(iQ).Item_Cost, 2)
Next iQ
答案 2 :(得分:0)
这有点粗略,因为它假设你永远不会有超过九个控件(即1到9)并且它假定TextBox和PictureBox控件都以相同的方式处理。如果表单上有其他TextBox或PictureBox控件,则无效。
For Each control In Me.Controls
If TypeOf control Is TextBox Then
Dim txt As TextBox = CType(control, TextBox)
Dim index As Integer = CInt(txt.Name.Substring(4, 1))
txt.Text = FormatCurrency(Items(index - 1).Item_Cost, 2)
ElseIf TypeOf control Is PictureBox Then
Dim pic As PictureBox = CType(control, PictureBox)
Dim index As Integer = CInt(pic.Name.Substring(4, 1))
pic.Image = Image.FromFile(Items(index - 1).Item_Image)
End If
Next
可以使其超过9个控件,但Name.Substring
调用需要更加智能化。
更新
我只是想到了另一种选择。 TextBox
和PictureBox
都有Tag
属性。您可以使用它来表示索引。如果未设置Tag
属性,则只需跳过它。
For Each control In Me.Controls
If TypeOf control Is TextBox Then
Dim txt As TextBox = CType(control, TextBox)
If Not txt.Tag Is Nothing Then
Dim index As Integer = CInt(txt.Tag)
txt.Text = FormatCurrency(Items(index).Item_Cost, 2)
End If
ElseIf TypeOf control Is PictureBox Then
Dim pic As PictureBox = CType(control, PictureBox)
If Not pic.Tag Is Nothing Then
Dim index As Integer = CInt(pic.Name.Substring(4, 1))
pic.Image = Image.FromFile(Items(index).Item_Image)
End If
End If
Next
这样做的好处是,如果向窗口添加新的TextBox / PictureBox对,则永远不必更改代码。只需添加控件,将Tag
属性设置为Items
数组的索引,该数组应该用于填充每个数组,然后离开。
答案 3 :(得分:0)
最有效的方法是让你的代码知道你的用户界面中存在逻辑控制范围。
Dim textboxesRange As TextBox()
Dim pictureboxesRange As PictureBox()
在构造函数中,您必须初始化这些范围。
Public Sub New()
// ...
textboxesRange = {Item1_TB, Item2_TB, Item3_TB, Item4_TB, Item5_TB, Item6_TB }
pictureboxesRange = {Item1, Item2, Item3, Item4, Item5, Item6 }
// ...
End Sub
之后,您将能够遍历这些数组:
For i = 0 To textboxesRange.Length - 1
textboxesRange(i).Text = FormatCurrency(Items(i).Item_Cost, 2)
Next
For i = 0 To pictureboxesRange.Length - 1
pictureboxesRange(i).Image = Image.FromFile(Items(i).Item_Image)
Next
通过这种,您可以让代码了解存在相关控件的现实,从而加强您的应用。从现在开始,您不仅可以更轻松地启动值,还可以更改或重置它们(如果需要)。您还可以以动态,健壮,优雅和高效的方式将这些控件作为不同事物(隐藏,移动等)的逻辑组进行操作。
虽然使用控件的Name
或Tag
属性也可以很好地工作,但恕我直言,这是不好的做法,因为这些并不是专门用于解决这样一个特定问题。不要试图依赖那些。