Vb.net 如何在For循环中递增变量名称,例如bar1、bar2、bar3、VBNET?
我试图简化我的代码:Vb.net 如何在For循环中递增变量名称,例如bar1、bar2、bar3、VBNET?,vb.net,Vb.net,我试图简化我的代码: bar_x(0) = delocateX(bar1.Left) bar_y(0) = delocateY(bar1.Top) bar_x(1) = delocateX(bar2.Left) bar_y(1) = delocateY(bar2.Top) bar_x(2) = delocateX(bar3.Left) bar_y(2) = delocateY(bar3.Top)
bar_x(0) = delocateX(bar1.Left)
bar_y(0) = delocateY(bar1.Top)
bar_x(1) = delocateX(bar2.Left)
bar_y(1) = delocateY(bar2.Top)
bar_x(2) = delocateX(bar3.Left)
bar_y(2) = delocateY(bar3.Top)
bar_x(3) = delocateX(bar4.Left)
bar_y(3) = delocateY(bar4.Top)
这一直持续到29岁,我试图使用For循环来减少行数并简化代码。
这是我的尝试:
Function set_bar_positions()
Dim i As Double
For i = 0 To 29
bar_x(i) = delocateX(("bar" & (i + 1)).Left)
bar_y(i) = delocateY("bar" & (i + 1) + ".Top")
Next
如何简化此函数?
使用
Left
和Top
的事实表明,这些变量指的是控件。如果是这种情况,您可以通过父级的控件
集合按名称访问控件。假设它们是直接添加到设计器窗体中的控件:
bar_x(i) = delocateX(Controls("bar" & (i + 1)).Left)
bar_y(i) = delocateY(Controls("bar" & (i + 1)).Top)
请注意,这不适用于变量。在设计器中将控件添加到窗体时,创建的字段与控件的
name
属性中包含的字段具有相同的名称,这种情况非常方便;您可以自己做表单设计器为您做的事情—它实际上是将所有的条添加到按字符串索引的集合中
您可以在构造函数中执行同样的操作,并使其更容易:
Private bars() as New Control 'make an array of controls
'In the constructor
Sub New(...)
'If you have 29 bars
ReDim bars(28)
bars(0) = bars1
bars(1) = bars2
...
请记住,数组从0开始,因此当需要bars1时,您需要做一些数学运算,因为在数组中它位于索引0处,或者您可以运行数组,使其包含30个元素,将bars1放入bars(1)等,然后忽略数组的第一个元素
记住,这将建立对现有对象的新引用;您可以更改对象本身的任何内容,例如
bars1.Left=100
和bars(1)
将看到更改,但如果您更改一个全新对象的bars1,则bars(1)将保持指向旧对象,并且也需要更改我设法找到了最简单的解决方案:
Function set_bar_positions()
For i = 0 To 29
Dim cs = Me.Controls.Find("bar" & i.ToString(), True)
If cs.Any() Then
Dim c = cs.First()
bar_x(i) = delocateX(c.Left)
bar_y(i) = delocateY(c.Top)
End If
Next
End Function
正如所回答的,如果
barX
是类字段或属性,则可以使用反射,但这很难看。那些是barX
s UI控件吗?考虑使用A。