为每个标签名称指定值

时间:2017-07-13 02:04:44

标签: vb.net

有人可以教我如何为每个标签指定一个同名的值吗? 例如,我有一个名为label1的10标签,直到label10。在每个标签上,我想显示sql的不同值。这是我的代码。

Dim sqlCmd As New SqlCommand("select distinct top 15  Machine_no  from table5 ", conn)
    Dim sqlDa As New SqlDataAdapter(sqlCmd)
    sqlDa.Fill(dt)

    If dt.Rows.Count > 0 Then
        For i As Integer = 0 To dt.Rows.Count
            lblMachine1.text = dt.Rows(0)("Machine_no").ToString)
            lblMachine2.Text = dt.Rows(1)("Machine_no").ToString
            lblMachine3.Text = dt.Rows(2)("Machine_no").ToString
            lblMachine4.Text = dt.Rows(3)("Machine_no").ToString
            lblMachine5.Text = dt.Rows(4)("Machine_no").ToString
            lblMachine6.Text = dt.Rows(5)("Machine_no").ToString
            lblMachine7.Text = dt.Rows(6)("Machine_no").ToString
            lblMachine8.Text = dt.Rows(7)("Machine_no").ToString
            lblMachine9.Text = dt.Rows(8)("Machine_no").ToString
            lblMachine10.Text = dt.Rows(9)("Machine_no").ToString
            lblMachine11.Text = dt.Rows(10)("Machine_no").ToString
            lblMachine12.Text = dt.Rows(11)("Machine_no").ToString
            lblMachine13.Text = dt.Rows(12)("Machine_no").ToString
            lblMachine14.Text = dt.Rows(13)("Machine_no").ToString
            lblMachine15.Text = dt.Rows(14)("Machine_no").ToString
        Next
    End If

问题是,例如,当第5行中没有数据时,系统会给出错误。

3 个答案:

答案 0 :(得分:0)

欢迎来到网站!

在我们解决您的问题之前,我想指出:

  

"问题是,例如,当行5中没有数据时,系统会   给出错误。"

过于宽泛,无法真正识别您的问题。

同时包含您收到的错误消息会非常有帮助。

关于您的真实问题,可以使用DirectCast缩短您的代码。你可以尝试这个:

    If dt.Rows.Count > 0 Then
        For i = 0 To dt.Rows.Count - 1
            DirectCast(Controls.Find("lblMachine" & i + 1, True)(0), Label).Text = dt.Rows(i).Item("MachineNo").ToString
        Next
    End If

在您的代码中使用For Loop是一个良好的开端,但您根本没有对它进行集成。在上面的代码中,您可以看到i的使用方式。

同样dtDataTable对吗? DataTablesindex-based,因此它以zero(0)开头。这就是为什么您可以在For Loop语句中注意到dt.Rows.Count - 1

希望它有所帮助。

答案 1 :(得分:0)

您使用i作为循环变量,但不是用来引用标签。

您可以尝试将标签放在一个数组中,然后按索引将它们匹配到一行,如下所示:

Dim labels = {lblMachine1, lblMachine2, lblMachine3, lblMachine4,...}

Dim sqlCmd As New SqlCommand("select distinct top 15  Machine_no  from table5 ", conn)
Dim sqlDa As New SqlDataAdapter(sqlCmd)
sqlDa.Fill(dt)

If dt.Rows.Count > 0 Then
    For i As Integer = 0 To dt.Rows.Count -1
        dim row= dt.rows(i)
        labels(i).text = row("Machine_no")
    Next
End If

你也可以使用FindControl for windows formas @Allen指出。但是当使用Web时,您需要实现一个递归版本,因为您正在寻找的控件通常嵌套在其他控件中。

private FindControlRecursive(control  parent, string id) as control  
   if parent.id=id then return parent
   for each child in parent.controls
       control result = FindControlRecursive(child, id)
       if not result is nothing then return result
   next
end function

然后在你的代码中:

Dim sqlCmd As New SqlCommand("select distinct top 15  Machine_no  from table5 ", conn)
Dim sqlDa As New SqlDataAdapter(sqlCmd)
sqlDa.Fill(dt)

If dt.Rows.Count > 0 Then
    For i As Integer = 0 To dt.Rows.Count -1
         fincontrolrecursive("lblMachine" + i).text = dt.rows(i)("Machine_no")
    Next
End If

答案 2 :(得分:0)

https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/statements/for-each-next-statement

也尝试搜索: 每个控制循环的Vb.net

您很可能必须使用List(Of Label)

进行直接对象引用

这是我的看法。未经测试。

Dim machList As List(Of Label) = New List(Of Label)
For Each label As Label In GroupBox1.Controls
machList.Add(label)
Next label 
        For row As Integer = 0 To dt.Rows.Count
If dt.Row(row) <> Nothing Then
    machList.Index(row).Text = dt.Rows(row)
End If
Next row