Как получить доступ к управлению из родительского aspx из дочернего ascx - PullRequest
0 голосов
/ 29 марта 2012

Я пытаюсь получить доступ к элементу управления MainContentBlock из aspx, но не могу этого сделать.

В файле 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".

и кажется, что он, по крайней мере, снова распознал родительскую часть.

растерян ... пожалуйста, помогите, спасибо.

Ответы [ 3 ]

1 голос
/ 29 марта 2012

Это потому, что вы пытаетесь сослаться на 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 голосов
/ 29 марта 2012

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 голосов
/ 29 марта 2012

В зависимости от того, где находится элемент управления на странице, вам может потребоваться найти его рекурсивно, но в простой ситуации вы просто сделаете это:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...