我尝试从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部分。
困惑......请帮助,谢谢。
答案 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;
}