如何从其子ascx访问父aspx的控件

时间:2012-03-29 19:27:22

标签: asp.net vb.net user-controls ascx findcontrol

我尝试从aspx访问MainContentBlock控件,但无法执行此操作。

在aspx文件中,我已经注册了两个控件:

<uc3:ContentBlock ID="MainContentBlock" runat="server" DynamicParameter="id" DefaultContentID="3951" /></uc3>

<uc3:childshow ID="Childshow" runat="server"/></uc3>

在child.ascx背后的代码中

If Me.Parent.Page.FindControl("MainContentBlock") IsNot Nothing AndAlso Me.MainContentBlock.Item.Id = 4357 Then

...

但错误说BC30456:'MainContentBlock'不是'child'的成员。

这几乎就像“.parent”部分不起作用。

但是,如果我尝试以下方法:

If Me.Parent.MainContentBlock IsNot Nothing AndAlso Me.MainContentBlock.Item.Id = 4357 Then

...

它将显示错误“BC30456:'MainContentBlock'不是'System.Web.UI.Control'的成员。

并且似乎至少再次认出了.parent部分。

困惑......请帮助,谢谢。

3 个答案:

答案 0 :(得分:1)

这是因为你试图引用MainContentBlock作为子控件的属性。当您使用Me.MainContentBlock时,Me会引用子控件。

您只需要使用FindControl,并正确引用找到的控件:

Dim myBlock As ContentBlock = TryCast(Me.Parent.FindControl("MainContentBlock"), ContentBlock)

If myBlock IsNot Nothing Then
    'do things with myBlock
End If

答案 1 :(得分:0)

根据控件在页面上的位置,您可能需要递归地找到它,但在一个简单的情况下,您只需执行此操作:

var pnl = Page.FindControl("MainContentBlock") as Panel; //or whatever it is
if (pnl != null)
{
    //your code here
}

如果您需要,这是一个递归方法:

public Control FindControlRecursive(string controlID, Control parentCtrl)
{
    foreach (Control ctrl in parentCtrl.Controls)
    {
        if (ctrl.ID == controlID)
            return ctrl;
        FindControlRecursive(controlID, ctrl);
    }
    return null;
} 

你会这样称呼它:

var pnl ((PageName)Page).FindControlRecursive("MainContentBlock") as Panel;

答案 2 :(得分:0)

FindControl有效,但痛苦的是你所寻找的东西可能高于父级。这是我使用的一种方便的方法:

public static Control FindControlRecursive(Control root, string id)
{
    if (root.ID == id)
        return root;

    foreach (Control ctl in root.Controls)
    {
        Control foundCtl = FindControlRecursive(ctl, id);

        if (foundCtl != null)
            return foundCtl;

    }
    return null;
}