2017-07-13 67 views
0

有人可以教我如何爲每個具有相同名稱的標籤賦值? 例如,我有一個名稱爲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中沒有數據時,系統會報錯。

+0

使用'因爲我整數= 0到dt.Rows.Count'是完全沒有意義的,因爲你沒有在任何地方使用'i'! –

回答

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

希望它有幫助。

+0

哇!感謝你的幫助。我試圖按照你的回答,但是這個錯誤出來了。指數數組的邊界之外。 –

+0

檢查您的名稱中包含'lblMachine'的標籤數量是否與數據庫中的'MachineNo'的數量相符。 –

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窗戶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 
+0

關於控件中的嵌套,'Controls.Find'已經有了我想要的功能(如果我錯了,請糾正我)。 'Controls.Find'的參數是'key'(控件名稱的第一個參數,字符串),第二個參數是'searchAllChildren'參數,它是一個布爾值,我已經在我的答案中使用了這個參數。 –

+0

是的,窗戶和網站。 Web不是遞歸的。注意我正在使用「id」而非名稱。應該已經清楚了。 https://msdn.microsoft.com/en-us/library/31hxzsdw(v=vs.110).aspx –

+1

這就是爲什麼。讓我回頭看他的帖子。標記爲'vb.net'。無論如何,最好有選擇,並感謝更多的知識。乾杯。 –

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