【问题标题】:Call a control using the Name property使用 Name 属性调用控件
【发布时间】:2019-03-22 05:05:53
【问题描述】:

我有一系列控件:TextBox、Label 和 Panel。控件是在代码而不是设计器中动态创建的。我的问题是如何使用我在代码中设置的 .Name 属性调用标签和面板控件? 这就是我所拥有的

Public Class frmMain
  Private Sub DraControls()
    Dim pans as New Panel
      With pans
      .AutoSize = True
      .Parent = Me
      .Name = "Panel1"
      End With
    Dim labs as New Label
      With labs
        .Text = "%"
        .Name = "PercentageLabel00"
        .Parent = pans
      End With
  End Sub
End Class

然后我有一个点击事件,它将使标签更改其文本。

Dim PercentTextLabel As Label = CType(Me.Controls("PercentageLabel00"), Label)
PercentTextLabel.Text = "OK"

我需要更改标签的文本,但收到错误 System.NullReferenceException: 'Object reference not set to an instance of an object.'

我已经尝试过其他方法,例如 Controls.Find,但我得到了相同的结果

谢谢!

【问题讨论】:

  • 第一个代码 sn-p 实际上从未将您创建的控件添加到表单的Controls 集合中。如果你不把它们放进去,你怎么能把它们拿出来?如果您确实将它们放在该集合中,那么第二个 sn-p 将起作用,假设您使用正确的名称。当然,如果您将它们放入其他容器的 Controls 集合中,例如GroupBox 或 TabPage,那么您必须再次将它们从 Controls 集合中取出,而不是从表单的 Controls 集合中取出。
  • @jmcilhinney 不是函数。Parent 将它们放入控件集合中?
  • 是的,我刚刚发帖说我意识到情况就是这样。问题是,正如我所说,您将Label 添加到Panel 的Controls 集合中,而不是表单,因此您以后无法从表单中取回它。您可以从表单的Controls 集合中获取Panel,但是您必须从Panel 的Controls 集合中获取Label。
  • @jmcilhinney 我尝试从表单中获取面板(成功),但是当我从面板中获取标签时,我得到空引用异常。
  • 对于记录设置,Parent 属性是不够的(也没有必要)。要将标签添加到面板,您需要调用 pans.Controls.Add(labs)。至于访问它,请确保将True 指定为Controls.Find(String, Boolean) 的第二个参数,以便对整个表单及其所有容器执行递归搜索。这将返回一个数组,因此您必须访问第一个元素:Me.Controls.Find("PercentageLabel00", True)(0)。

标签: vb.net


【解决方案1】:

根据 cmets。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim p As Panel = CType(Me.Controls("Panel1"), Panel)
    CType(p.Controls("PercentageLabel00"), Label).Text = "OK"
End Sub

或者单行

CType(CType(Me.Controls("Panel1"), Panel).Controls("PercentageLabel00"), Label).Text = "OK"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多