Список VB2010 (из строки) для нескольких меток

У меня есть 64 панели, каждая из которых содержит две строки данных. В целях тестирования я использовал генератор случайных чисел для предоставления своих данных.

Я создал список строк (всего 64 строки, содержащие «,», разделяющие две части данных на панель), и теперь мне нужно записать их на каждую метку.

Мне нужно найти способ разделить строковые данные (что я умею) и записать на каждую метку.

Например: первая строка будет разделена и добавлена ​​на первую панель с именами Label1a и Label1b, вторая строка будет разделена на Label2a и Label2b и т. д.

Dim LotData As New List(Of String)

Dim randomnumber1 As Integer, randomnumber2 As Integer, randomchance As Integer
Dim slotnumber As String
Dim sbailes As String
Dim stemp As String

Randomize()

Dim n As Integer
For n = 1 To 64

  randomnumber1 = CInt(Rnd() * 1000000000)
  randomnumber2 = CInt(Rnd() * 300)
  randomchance = CInt(Rnd() * 1000)

  slotnumber = Convert.ToString(randomnumber1)

  'approximately 50% of the lots will be empty in this test
  If randomchance >= 500 Then
    sbailes = CStr(randomnumber2)
  Else
    sbailes = "0"
  End If

  LotData.Add(slotnumber & "," & sbailes)
Next

Мое единственное решение - написать 128 строк кода, вручную добавляя каждую строку, но я знаю, что должно быть лучшее решение, чем это...


person MisterLeonard    schedule 04.03.2013    source источник
comment
Это Windows Forms или ASP.Net?   -  person chue x    schedule 05.03.2013


Ответы (1)


Вы хотели бы получить элемент управления по имени строки. У меня есть несколько методов, которые помогают сделать это здесь (поместите их в модуль)

<Extension()> _
Public Function ChildControls(ByVal parent As Control) As ArrayList
    Return ChildControls(Of Control)(parent)
End Function

<Extension()> _
Public Function ChildControls(Of T)(ByVal parent As Control) As ArrayList
    Dim result As New ArrayList()
    For Each ctrl As Control In parent.Controls
        If TypeOf ctrl Is T Then result.Add(ctrl)
        result.AddRange(ChildControls(Of T)(ctrl))
    Next
    Return result
End Function

Public Function GetControlByName(ByRef parent As Control, ByVal name As String) As Control
    For Each c As Control In parent.ChildControls
        If c.Name = name Then
            Return c
        End If
    Next
    Return Nothing
End Function

Затем в вашем методе вы можете получить элемент управления по имени, в зависимости от целого числа от 1 до 64, например:

For i As Integer = 1 To 64
    CType(GetControlByName(Me, "Label" & i.ToString() & "A"), Label).Text = _
        LotData(i).Split(",").FirstOrDefault()
    CType(GetControlByName(Me, "Label" & i.ToString() & "B"), Label).Text = _
        LotData(i).Split(",").LastOrDefault()
Next

Ой! Вы также можете избавить себя от необходимости добавлять все элементы управления в форму во время разработки, выполнив что-то вроде этого:

For i As Integer = 1 To 64
    Dim lblA As New Label()
    Dim lblB As New Label()
    lblA.Name = "Label" & i.ToString() & "A"
    lblB.Name = "Label" & i.ToString() & "B"
    ' do something about Locations here
    Me.Controls.Add(lblA)
    Me.Controls.Add(lblB)
    ' you could even add them to your panel.controls
Next

(не забывайте об обработке исключений)

person djv    schedule 05.03.2013