2012-03-29 52 views
0

访问控制我尝试从ASPX访问MainContentBlock控制,但未能如愿。如何从父ASPX从其子ASCX

在我已经注册了这两个控件的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的“一员。控制”。

,似乎它至少再次确认.parent一部分。

迷茫......请帮助,谢谢。

回答

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 
+0

嗨,但我已经添加.Parent.FindControl()?我认为这将访问父aspx文件?对不起仍然困惑... – eastboundr 2012-03-29 19:32:57

+0

FindControl可能会找到该控件,但这不会更改引用或尝试引用Me.MainContentBlock。 – 2012-03-29 19:35:07

+0

谢谢我想我看到问题出在哪里... – eastboundr 2012-03-29 19:37:30

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; 
+0

嗨,詹姆斯,谢谢,我想我设法让孩子在aspx中找到控制权。不过,我也想访问该用户控件的属性,如: 如果Me.Parent.FindControl(“MainContentBlock”)EkItem状态并没有没有什么然后.... 哪里EkItem是控件的属性。我在这一点上无法访问EkItem,因为它给了我错误: BC30456:'EkItem'不是'System.Web.UI.Control'的成员。 我做错了什么?谢谢。 – eastboundr 2012-03-29 19:47:07

+0

实际上我得到它的工作。谢谢! – eastboundr 2012-03-29 20:00:24

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; 
} 
+0

谢谢,我想我找到了控制。但你知道我怎么也能访问它的财产?例如:Me.Parent.FindControl(“MainContentBlock”)。EkItem 其中EkItem是用户Control的属性。上面的行给我一个错误:BC30456:'EkItem'不是'System.Web.UI.Control'的成员。有任何想法吗?谢谢 – eastboundr 2012-03-29 19:50:35

+0

现在工作,谢谢 – eastboundr 2012-03-29 20:00:34

+0

回答以前的评论:类型铸造 – 2012-03-29 21:24:03