【发布时间】: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