第一次发帖。 在VB6中工作
我有一个Form(frmMC),其上放置了嵌套的用户控件。
frmMC
.... xMcNew [User Control]
.......xPage [User Control]
.................cmdPageDown1 [Control]
使用插入cmdPageDown1代码块中的这些语句:
Debug.Print Screen.ActiveControl.Name
Debug.Print UserControl.Name
Debug.Print ActiveControl.Name
我可以返回我想要的4个中的3个的名称值。即,
xMCGridNew1
XPAGE
cmdPageDown1
如何返回父级的名称(frmMC)?
Debug.Print [Magic Incantation Statements]
Debug.Print Screen.ActiveControl.Name
Debug.Print UserControl.Name
Debug.Print ActiveControl.Name
什么是魔术咒语?
我有一个变量
g_strPredecessorForm = Me.Name
当前在表单的load事件中使用,并且凭借其全局特性可见/暴露给用户控件,这用于获取该名称,但我认为有更直接的方式。
感谢。
答案 0 :(得分:0)
当您开始使用自定义控件时,属性可能会有点混乱。据我了解你的问题,你有一个名为xPage
的UserControl,它包含一个名为cmdPageDown1
的组件CommandButton控件。然后,您有另一个名为xMcNew
的UserControl,其中包含xPage
控件的实例。这个答案假设我的理解是正确的。
Parent
属性与嵌套的自定义控件不一致。 (但是它不适合你的原因是因为你必须使用myControlName.Parent.Name
形式,而你没有引用任何控制。你得到的错误主要是问“谁的父母?” )
另外,使用Screen.ActiveControl.Name
有点迂回并且不一致:如果它适用于您的情况,那么巧合,如果您对结构进行了更改,您可能会发现它停止工作。更好的解决方案是使用ParentControls
对象的UserControl
集合。
ParentControls
集合包含对父对象的Controls
集合中所有控件的引用。集合的第一个成员始终是控件的容器(据我所知,您可能需要比我更彻底地测试它。看看这段代码:
Dim i As Integer
With UserControl
For i = 0 To .ParentControls.Count - 1
Debug.Print .ParentControls(i).Name
Next
End With
如果从嵌套控件的各个级别的命令按钮运行此命令,您将开始了解ParentControls
的工作原理。您正在寻找的参考文献(来自cmdPageDown1
的{{1}}事件处理程序):
Click
现在,请记住,如果你更深入地进行嵌套,你就不能这样做。 Debug.Print ActiveControl.Name 'cmdPageDown1
Debug.Print UserControl.Name 'xPage
Debug.Print UserControl.ParentControls(0).Name 'xMCGridNew1
Debug.print UserControl.ParentControls(0).Parent.Name 'frmMC
集合中对控件的引用本身不包含ParentControls
对象。所以,如果你试试这个,你会收到一个错误:
UserControl
我知道因为我试过了。 :)如果你想进入另一个级别的嵌套,你将不得不想出一个类似于自定义属性的东西,如果它是用户控件则返回父控件的完整实例,如果不是则返回其他东西。 / p>