1

我正在尝试将字符串转换为对象(这是过程的参数)。我也试过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

错误是:

你调用的对象是空的。

4

5 回答 5

2

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
于 2011-06-23T15:04:12.177 回答
2

正如 Vivek 指出的那样,xL 是Nothing。对于您给定的ii.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
于 2011-06-23T15:08:24.307 回答
1

您显示的代码期望在您的表单上找到三个 Label 控件(或至少在正在运行的代码范围内),名为 lbl1、lbl2 和 lbl3。

该错误告诉您找不到这些控件中的一个或多个。

于 2011-06-23T15:07:35.363 回答
1

与其传递 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
于 2011-06-23T15:19:31.627 回答
0

我需要做类似的事情,我得到了同样的错误,

(你调用的对象是空的。

在类似的行上:

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

我可以通过将控件所在的确切位置添加到控件来修复它,在我的情况下是 TabPage3:

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

瞧,它成功了!

于 2020-12-09T17:03:44.123 回答