2

如何Label使用循环隐藏多个控件?我尝试使用以下代码这样做:

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

但这对我不起作用。当代码执行时,它会在行NullReferenceException上抛出一个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? OfType适用于 VS2008 和 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

当您尝试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

像这样检查 if lblisNothing将阻止NullReferenceException抛出。但是,这并不能解释为什么它Nothing首先会返回。

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

  • 你有错误的控件名称。您正在寻找名称为“Label1”的控件,但您可能弄错了,这可能不是控件的实际名称。例如,控件的名称可能与引用它的变量名称不同。要确定,请检查 的值Label1.Name以查看其名称的实际含义。
  • 表单上的Controls属性已重载,因此它不会调用基本属性。要解决这个问题,您可以指定MyBase.Controls而不是简单地指定Controls.
于 2013-01-10T12:51:41.010 回答
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 回答