如何使用循环隐藏多个Label
控件?我尝试使用以下代码执行此操作:
Dim i As Integer
For i = 1 To 14
Dim lbl = Controls("Label" & i)
lbl.Visible = False
Next
但它不适合我。代码执行时,会在NullReferenceException
行上抛出lbl.Visible = False
。
答案 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.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中。