Vb.net 在VB中使用控件更改标签文本

Vb.net 在VB中使用控件更改标签文本,vb.net,Vb.net,我正在尝试使用“控件”命令更改标签文本,使用此行 Controls("C_" & 0).Text = "Conta:" 但是我得到了这个错误 System.NullReferenceException 如果我删除此标签并将其更改为具有相同名称C_0的文本框,它会工作!但我需要一个标签而不是一个文本框 这是因为您没有名为C_0的控件。我建议使用获取控件,然后使用条件If语句检查返回的控件是否存在: Dim desiredControls() As Control = Me.Control

我正在尝试使用“控件”命令更改标签文本,使用此行

Controls("C_" & 0).Text = "Conta:"
但是我得到了这个错误

System.NullReferenceException

如果我删除此标签并将其更改为具有相同名称C_0的文本框,它会工作!但我需要一个标签而不是一个文本框


这是因为您没有名为C_0的控件。我建议使用获取控件,然后使用条件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个控件时不会引发异常。

好的,我发现问题。。。此命令不起作用,因为它位于GroupBox中

那么正确的代码是

Me.Controls("GroupBox1").Controls("C_" & 0).Text = "123"

谢谢大家的帮助

您的问题是控件。控件仅直接返回控件内部的控件。因此,您可以使用这些扩展方法。将其放在一个模块中:

<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

无论标签是否在GroupBox中,如果您将其移动到其他GroupBox、Panel或返回表单,而无需更改代码,这都会起作用。

无法复制。我创建了标签L_0、文本框T_0和复选框C_0,并使用了以下代码:ControlsL_&0.Text=Conta:ControlsT_&0.Text=Conta:ControlsC_&0.Text=Conta:,所有控件的文本属性都已设置。你必须要么没有控制权,要么你有打字错误。另外,不要在整数上使用字符串连接。使用格式化程序或字符串插值。您还可以在MessageBox中显示所有标签的名称:MessageBox.ShowString.Join,Controls.OfTypeOf Label.SelectFunction l.Name以确认您确实拥有它。请查看我添加的照片。。。嗯,我来看看字符串插值!谢谢MessageBox.ShowString.Join,Controls.OfTypeOf Label.selectfunction l.Name为我显示一个空白的MessageBox!!!好了,伙计们,我想我发现了问题。。。我制作了一个名为C_0的新标签,它成功了!!!旧标签没有。。。我不知道为什么。。。可能它已损坏?如果您使用我提供的代码,这不会是一个问题,因为ControlCollection.Find方法的searchAllChildren参数。没错,我正试图使其尽可能简短。非常感谢。如果您真的想要一行解决方案,请查看我的编辑。
' 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:"