使用循环隐藏多个标签

时间:2013-01-10 11:15:27

标签: vb.net label hide

如何使用循环隐藏多个Label控件?我尝试使用以下代码执行此操作:

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

但它不适合我。代码执行时,会在NullReferenceException行上抛出lbl.Visible = False

3 个答案:

答案 0 :(得分:1)

您收到该错误的原因可能是因为您的表单上有少于14个标签。我猜它不是Label14,甚至是数字较小的标签。检查一下。

另外,如果你想隐藏表单上的所有标签,那么最好这样做:

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

发表评论后

您使用的是哪个版本的Visual Studio? OfType适用于VS2008和2010.也许不适用于早期版本......

另一种方法是:

For Each cnt As Control In Me.Controls
    If TypeOf cnt Is Label Then
        cnt.Visible = False
    End If
Next

答案 1 :(得分: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是否Nothing,这样会阻止NullReferenceException被抛出。但是,这并不能解释为什么它首先返回Nothing

我可以想到为什么它可能找不到你的控制权有两个原因:

  • 您的控件名称错误。您正在寻找名为“Label1”的控件,但您可能会弄错,这可能不是控件的实际名称。例如,控件的名称可能与引用它的变量名称不同。要确切知道,请检查Label1.Name的值以查看其实际名称。
  • 表单上的Controls属性已经过载,因此它不会调用基本属性。要解决此问题,您可以指定MyBase.Controls,而不仅仅是Controls

答案 2 :(得分: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中。