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

Vivek が指摘するように、xL はNothing. 指定された に対して、iNulli.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 に答える
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 に答える
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 に答える
1

表示しているコードは、フォーム上 (または少なくとも実行中のコードの範囲内) に lbl1、lbl2、lbl3 という名前の 3 つの Label コントロールがあることを期待しています。

エラーは、これらのコントロールの 1 つ以上が見つからないことを示しています。

于 2011-06-23T15:07:35.363 に答える