Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 如何在For循环中递增变量名称,例如bar1、bar2、bar3、VBNET?_Vb.net - Fatal编程技术网

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。