嵌套用户控件 - 返回放置

时间:2018-01-21 16:52:09

标签: vb6 nested

第一次发帖。 在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事件中使用,并且凭借其全局特性可见/暴露给用户控件,这用于获取该名称,但我认为有更直接的方式。

感谢。

1 个答案:

答案 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>