VB.NET проходит через одноименные элементы управления - PullRequest
0 голосов
/ 02 января 2012

Хорошо, у меня есть щекотка для твоих мозгов.Я конвертирую программу, написанную на VB6, в Visual Studio 2010 VB.Net и столкнулся с проблемой.Я пытаюсь перебрать 20 элементов формы в форме, у которой у всех есть префикс «chkCustomerItems», а затем за ними от 1 до 20.Я использую это при поиске в базе данных, чтобы при наличии записи в базе данных он затем применял имя элемента базы данных к текстовому полю флажка и включал видимость.Вот код, который я написал: ConnOpenClose ()

Rs = New ADODB.Recordset
Sql = "SELECT * FROM CustomersItems;"
Rs.Open(Sql, Conn)

If Rs.EOF = False Then
    tempInteger = 1
    Rs.MoveFirst()
    Do
        tempString = "chkCustomerItems" & tempInteger.ToString
        Me.Controls(tempString).Text = Rs.Fields("Item").Value
        Me.Controls(tempString).Visible = True
        tempInteger = tempInteger + 1
        Rs.MoveNext()
        If tempInteger = 21 Then GoTo ExitLoop
    Loop Until Rs.EOF
ExitLoop:
End If

При запуске я получаю сообщение об ошибке NullReferenceException.Это в основном код, который я использовал в VB6 (с некоторыми изменениями для инфраструктуры .NET).Помогите, пожалуйста, выяснить, что я делаю не так, на данный момент мне приходится жестко кодировать все 20 элементов, и пока он работает, он не выглядит и не работает красиво.

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 02 января 2012

Если какой-либо из ваших элементов управления встроен в какие-либо элементы управления контейнера (панели, вкладки и т. Д.), Вы не сможете получить к ним доступ посредством индексации коллекции Controls.

Вместо этого вам нужно будет использовать Controls.Find со вторым параметром (searchAllChildren), установленным в значение true (я также добавил некоторые дополнительные проверки и .Net способы выполнения действий):

 Do
    tempString = "chkCustomerItems" & tempInteger.ToString

    Dim aoControls As Control()
    aoControls = Me.Controls.Find(tempString, True)
    If aoControls IsNot Nothing AndAlso aoControls.Length <> 0 Then
       Dim oTextBox As TextBox

       oTextBox = TryCast(aoControls(0), TextBox)
       If oTextBox IsNot Nothing Then
          oTextBox.Text = Rs.Fields("Item").Value
          oTextBox.Visible = True
       End If
    End If

    tempInteger = tempInteger + 1
    Rs.MoveNext()
    If tempInteger = 21 Then 
       Exit Do
    End If
Loop Until Rs.EOF
0 голосов
/ 02 января 2012

вы используете Text свойство, поэтому я предполагаю, что это текстовое поле.
попробуйте это:

DirectCast(Controls(tempString), TextBox).Text = Rs.Fields("Item").Value
...