我正在尝试使用此行通过Controls命令更改标签文本
Controls("C_" & 0).Text = "Conta:"
但是我得到这个错误
“ System.NullReferenceException”
如果我删除此标签并将其更改为文本框(名称为“ C_0”),则可以使用!但是我需要使用Label而不是文本框来做到这一点...
答案 0 :(得分:1)
这是因为您没有名为C_0
的控件。我建议使用ControlCollection.Find获取控件,然后使用条件If语句检查返回的控件是否存在:
Dim desiredControls() As Control = Me.Controls.Find("C_" & 0, True)
If desiredControls.Count = 0 Then
'No controls named C_0 found
ElseIf desiredControls.Count > 1 Then
'Multiple controls named C_0 found
Else
desiredControls(0).Text = "Conta:"
End If
或者,如果您只想要单线,则可以使用:
Me.Controls.Find("C_" & 0, True).First().Text = "Conta:"
但是,我强烈建议您使用条件If语句,以便在找到0个控件的情况下不会引发异常。
答案 1 :(得分:0)
好吧,我发现了问题...该命令不起作用,因为它在GroupBox中。
然后正确的代码是
Me.Controls("GroupBox1").Controls("C_" & 0).Text = "123"
感谢大家的帮助!
答案 2 :(得分:0)
您的问题是控件。控件仅将控件直接返回到控件内部。因此,您可以使用这些扩展方法。将此放入模块:
<Extension>
Public Function ChildControls(parent As Control) As IEnumerable(Of Control)
Return ChildControls(Of Control)(parent)
End Function
<Extension>
Public Function ChildControls(Of TControl As Control)(parent As Control) As IEnumerable(Of TControl)
Dim result As New List(Of TControl)
For Each ctrl As Control In parent.Controls
If TypeOf ctrl Is TControl Then result.Add(CType(ctrl, TControl))
result.AddRange(ctrl.ChildControls(Of TControl)())
Next
Return result
End Function
这是您将如何使用它:
' general option to return all controls, filter on name
Me.ChildControls().Single(Function(c) c.Name = "C_" & 0)).Text = "Conta:"
' generic option to return only Labels, filter on name
Me.ChildControls(Of Label)().Single(Function(c) c.Name = "C_" & 0)).Text = "Conta:"
无论标签是否在GroupBox中,以及是否将其移动到其他GroupBox,Panel或移回窗体,这都将起作用,而无需更改代码。