如何Label
使用循环隐藏多个控件?我尝试使用以下代码这样做:
Dim i As Integer
For i = 1 To 14
Dim lbl = Controls("Label" & i)
lbl.Visible = False
Next
但这对我不起作用。当代码执行时,它会在行NullReferenceException
上抛出一个lbl.Visible = False
。
您收到该错误的原因可能是因为您的表单上的标签少于 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
当您尝试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 lbl
isNothing
将阻止NullReferenceException
抛出。但是,这并不能解释为什么它Nothing
首先会返回。
我可以想到为什么它可能无法找到您的控制权有两个原因:
Label1.Name
以查看其名称的实际含义。Controls
属性已重载,因此它不会调用基本属性。要解决这个问题,您可以指定MyBase.Controls
而不是简单地指定Controls
.我像这样更改我的代码..它现在可以工作了。
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 中。