Form.Controls
次のようにインデックスでコレクションからコントロールを取得しようとすると:
Dim lbl As Control = Controls(100)
そのインデックスによるコントロールが存在しない場合は、ArgumentOutOfRangeException
予想どおり、すぐに がスローされます。ただし、何らかの奇妙な理由で、ControlCollection
クラスを実装した人は誰でも、名前でコントロールを取得しようとすると、次のように決定しました。
Dim lbl As Control = Controls("Label100")
その名前のコントロールが存在しない場合は、例外をスローするのではなく、単に を返しますNothing
。したがって、安全のために、次のように、コントロールが実際に返されたことを確認する必要があります。
For i As Integer = 1 To 14
Dim lbl = Controls("Label" & i.ToString())
If lbl IsNot Nothing Then
lbl.Visible = False
End If
Next
lbl
そのようにisかどうかを確認するとNothing
、NullReferenceException
がスローされなくなります。ただし、そもそもなぜ戻ってきたのかは説明されていませんNothing
。
コントロールが見つからない理由として、次の 2 つが考えられます。
- コントロール名が間違っています。「Label1」という名前のコントロールを探していますが、間違っている可能性があり、それがコントロールの実際の名前ではない可能性があります。たとえば、コントロールの名前がそれを参照する変数名と異なる可能性があります。確実に知るには、 の値を調べて、
Label1.Name
その名前が実際に何であるかを確認します。
- フォームの
Controls
プロパティがオーバーロードされているため、基本プロパティを呼び出していません。これを修正するMyBase.Controls
には、単にControls
.