2

Labelループを使用して複数のコントロールを非表示にするにはどうすればよいですか? 私は次のコードでそうしようとしました:

Dim i As Integer
For i = 1 To 14
    Dim lbl = Controls("Label" & i)
    lbl.Visible = False
Next

しかし、それは私にとってはうまくいきません。NullReferenceExceptionコードが実行されると、行に a がスローされlbl.Visible = Falseます。

4

3 に答える 3

1

このエラーが発生する理由は、フォームのラベルが 14 未満であるためと考えられます。Label14か、それよりも小さい番号のラベルすら存在しないと思います。それを確認します。

また、フォームのすべてのラベルを非表示にする場合は、次のようにすることをお勧めします。

 For Each lbl As Label In Controls.OfType(Of Label)()
     lbl.Visible = False
 Next

コメントの後:

どのバージョンの Visual Studio を使用していますか? OfTypeVS2008 と 2010 の両方で動作します。以前のバージョンでは動作しない可能性があります...

それを行う別の方法は次のとおりです。

For Each cnt As Control In Me.Controls
    If TypeOf cnt Is Label Then
        cnt.Visible = False
    End If
Next
于 2013-01-10T12:50:54.690 に答える
0

私はこのように私のコードを変更します..それは今働いています。

For i As Integer = 1 To 14
        Dim lbl = EMPGBDATA.Controls("Label" & i.ToString())
        If lbl IsNot Nothing Then
            lbl.Visible = False
        End If
    Next

EMPGBDATA は、私のフォームの GroupBox です。EMPGBDATA 内のこれらすべてのラベル。

于 2013-01-11T05:26:46.490 に答える
0

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かどうかを確認するとNothingNullReferenceExceptionがスローされなくなります。ただし、そもそもなぜ戻ってきたのかは説明されていませんNothing

コントロールが見つからない理由として、次の 2 つが考えられます。

  • コントロール名が間違っています。「Label1」という名前のコントロールを探していますが、間違っている可能性があり、それがコントロールの実際の名前ではない可能性があります。たとえば、コントロールの名前がそれを参照する変数名と異なる可能性があります。確実に知るには、 の値を調べて、Label1.Nameその名前が実際に何であるかを確認します。
  • フォームのControlsプロパティがオーバーロードされているため、基本プロパティを呼び出していません。これを修正するMyBase.Controlsには、単にControls.
于 2013-01-10T12:51:41.010 に答える