2015-04-28 3 views
1

У меня проблема. Конечно, я не лучший с VB, но не могу понять, почему я не работаю.Динамическое создание меток в цикле

У меня есть база данных Access, из которой я извлекаю данные. Я пытаюсь динамически создавать ярлыки, поэтому я могу представить данные так же красиво, как хочу. Однако при попытке выполнить его я получаю исключение «Исключение System.NullReferenceException: ссылка на объект, не установленная на экземпляр объекта» в строке arrayLabels(i).Text = "Howdy"

Я почти уверен, что это нечто глупо, м просто не хватает ... но вот мой код:

Private Sub TabControl2_Click(sender As Object, e As EventArgs) Handles TabControl2.Click, btnRefresh1.Click, btnRefresh2.Click, btnRefresh3.Click, ddSelectTech.SelectedIndexChanged, ddSelectTech2.SelectedIndexChanged 

    If TabControl2.SelectedIndex = 0 Then 

     'use this to count the number of rows 
     Dim numRows As Integer 

     'here be database stuff 
     Dim da2 As OleDb.OleDbDataAdapter 
     Dim ds2 As New DataSet 
     Dim con2 As New OleDb.OleDbConnection 
     con2.ConnectionString = dbProvider & dbSource 
     sqlStatusOpen = "SELECT * FROM work_orders WHERE status = 'In Progress';" 

     da2 = New OleDb.OleDbDataAdapter(sqlStatusOpen, con2) 
     con2.Open() 
     da2.Fill(ds2, "installations2") 
     con2.Close() 
     numRows = ds2.Tables("installations2").Rows.Count() 

     'create an array label based on the number of rows in the table 
     Dim arrayLabels(numRows) As Label 

     'loop it to actually make the labels, position them, and such 
     For i = 0 To (numRows - 1) 'just looping the number of rows 
      Dim x As Integer = 100 
      Dim y As Integer = 1 + (i * 10) 
      Try 
       TabPage3.Controls.Add(arrayLabels(i)) 
       arrayLabels(i).Text = "Howdy" 
       arrayLabels(i).Location = New Point(x, y) 
      Catch ex As Exception 
       MessageBox.Show(ex.ToString, "Looky there, Franky, another error", MessageBoxButtons.OK, MessageBoxIcon.Error) 
      End Try 

     Next 

    ElseIf TabControl2.SelectedIndex = 1 Then 

    ElseIf TabControl2.SelectedIndex = 2 Then 

    Else 

    End If 

End Sub 

конечно, если вы думаете, есть более эффективные способы справиться с этим, я открыт для предложений.

ответ

4

Ваш код:

Dim arrayLabels(numRows) As Label 

Создает массив с типом Label. Но каждая запись в этом массиве - null.

Попробуйте инициализировать каждую метку в цикле:

Dim label As New Label 
label.Text = "Howdy" 
label.Location = New Point(x, y) 
TabPage3.Controls.Add(label) 

И вам не нужно, чтобы сохранить метки внутри массива.

+1

Фактически, первым хитом google был https://msdn.microsoft.com/en-us/library/vstudio/487y7874(v=vs.100).aspx – gbianchi

+0

О, святое дерьмо, я перевыполнял * bleep * outta что ... логика была только вне моей досягаемости. Это был один из тех «усвоенных уроков» ... – jparnell8839

+0

@ jparnell8839. Вместо того, чтобы помещать местоположение метки в определенную точку, поместите их в «FlowLayoutPanel» на закладке? Что-то вроде 'FlowLayoutPanel.controls.Add (newLabel)' –

Смежные вопросы