Почему прямое преобразование строки в объект приводит к тому, что «ссылка на объект не установлена ​​на экземпляр объекта»?

Я пытаюсь преобразовать строку в объект (который является параметром процедуры). Я также попробовал Ctype, но это не сработало.

Public Sub procName(lbl1 as Label, lbl2 as Label, lbl3 as Label) 'suppose I have 10 labels
       
      'long code here
       
       for i as integer = 1 to 3
            dim xL as label = DirectCast(Controls("lbl" & i.ToString), Label)
            xL.text = i.Tostring    'I get the error here
       next

End Sub

Ошибка:

В экземпляре объекта не задана ссылка на объект.


person John Woo    schedule 23.06.2011    source источник


Ответы (5)


DirectCast(Controls("lbl" & i.ToString), Label) выдает нулевое значение (или ничего)

Что возвращает Controls("lbl" & i.ToString)? это типовой ярлык?

У меня не установлен VB, поэтому я не могу проверить следующий код:

For i as integer = 1 to 3 
    For Each acontrol As Control In Controls
       If acontrol.Name = "lbl" & i.ToString Then
           xL.text = i.Tostring
       End If
   Next
Next
person Viv    schedule 23.06.2011
comment
почему он возвращает нулевое значение? - person John Woo; 23.06.2011
comment
Не могли бы вы проверить, работает ли отредактированный код? Также имя элементов управления в форме - lbl1, lbl2, lbl3, верно? с таким же корпусом? - person Viv; 23.06.2011

Как указывает Вивек, xL - это Nothing. для вашего данного i, i.ToString() не может генерировать исключение нулевой ссылки.

Пытаться

for i as integer = 1 to 3
    dim xL as label = DirectCast(Controls("lbl" & i.ToString), Label)
    If xL IsNot Nothing
        xL.text = i.Tostring    
    End If
next
person Bala R    schedule 23.06.2011
comment
Я не могу понять, почему xL - это Nothing :( Итак, как я могу перекодировать это, чтобы я мог установить текстовое значение в lblA, lblB и lblC? - person John Woo; 23.06.2011

Код, который вы показываете, ожидает найти три элемента управления Label в вашей форме (или, по крайней мере, в рамках выполняемого кода) с именами lbl1, lbl2 и lbl3.

Ошибка сообщает вам, что один или несколько из этих элементов управления не могут быть найдены.

person Jay Riggs    schedule 23.06.2011

Вместо того, чтобы передавать 3 разных метки, как насчет того, чтобы передать список меток и выполнить итерацию по нему. Таким образом, ваша функция станет более динамичной и чище.

Public Sub procName(ByVal labels As List(Of Label))

        Dim i As Integer = 1

        For Each lbl As Label In labels

            Dim xL As Label = lbl

            xL.Text = i.ToString

            i += 1
        Next

End Sub
person Wicked Coder    schedule 23.06.2011

Мне нужно было сделать что-то подобное, и я получал ту же ошибку,

(В экземпляре объекта не задана ссылка на объект.

в аналогичной строке, например:

dim xL as label = DirectCast(Controls("lbl" & i.ToString), Label)

Мне удалось исправить это, добавив в Controls точное местоположение элемента управления, в моем случае TabPage3:

dim xL as label = DirectCast(TabPage3.Controls("lbl" & i.ToString), Label)

и вуаля, ЭТО РАБОТАЛО!

person user8546041    schedule 09.12.2020