Нахождение средств управления во вложенных основных страницах

Week = 0

Поместите это в начало вашего кода.

8
задан Joel Coehoorn 9 June 2009 в 19:30
поделиться

5 ответов

Во-первых, необходимо знать, что MasterPages на самом деле располагаются внутренние полосы газеты. Так так, чтобы событие MasterPage's Load на самом деле называют после события Load Вашего ASPX.

Это означает, Объект страницы является на самом деле самым высоким управлением в иерархии управления.

Так, знание этого, лучший способ найти любое управление в таких вложенных условиях, должно записать рекурсивную функцию, которая циклично выполняют посредством каждого управление и дочерних элементов управления, пока это не находит тот, который Вы ищете. в этом случае Ваши MasterPages являются на самом деле дочерними элементами управления основного управления Page.

Вы добираетесь до основного Объекта страницы из любого управления как это:

C#:

это. Страница;

VB.NET

Я. Страница

Я нахожу, что обычно, класс Управления FindControl () метод довольно бесполезен, поскольку среда всегда вкладывается.

Поскольку, если это, я решил использовать 3,5 новых функции Extension.NET для расширения класса Управления.

При помощи кода ниже (VB.NET), в говорят, Ваша папка AppCode, все Ваши средства управления теперь выполнят рекурсивную находку путем вызова FindByControlID ()

    Public Module ControlExtensions
    <System.Runtime.CompilerServices.Extension()> _
    Public Function FindControlByID(ByRef SourceControl As Control, ByRef ControlID As String) As Control
        If Not String.IsNullOrEmpty(ControlID) Then
            Return FindControlHelper(Of Control)(SourceControl.Controls, ControlID)
        Else
            Return Nothing
        End If
    End Function

    Private Function FindControlHelper(Of GenericControlType)(ByVal ConCol As ControlCollection, ByRef ControlID As String) As Control
        Dim RetControl As Control

        For Each Con As Control In ConCol
            If ControlID IsNot Nothing Then
                If Con.ID = ControlID Then
                    Return Con
                End If
            Else
                If TypeOf Con Is GenericControlType Then
                    Return Con
                End If
            End If

            If Con.HasControls Then
                If ControlID IsNot Nothing Then
                    RetControl = FindControlByID(Con, ControlID)
                Else
                    RetControl = FindControlByType(Of GenericControlType)(Con)
                End If

                If RetControl IsNot Nothing Then
                    Return RetControl
                End If
            End If
        Next

        Return Nothing
    End Function

End Module
4
ответ дан 5 December 2019 в 05:08
поделиться

Нахождение средств управления является болью, и я использовал этот метод, который я получил из блога CodingHorror долгое время назад с единственной модификацией, которая возвращает пустой указатель, если пустой идентификатор передается в.

/// <summary>
/// Recursive FindControl method, to search a control and all child
/// controls for a control with the specified ID.
/// </summary>
/// <returns>Control if found or null</returns>
public static Control FindControlRecursive(Control root, string id)
{
    if (id == string.Empty)
        return null;

    if (root.ID == id)
        return root;

    foreach (Control c in root.Controls)
    {
        Control t = FindControlRecursive(c, id);
        if (t != null)
        {
            return t;
        }
    }
    return null;
}

В Вашем случае я думаю, что Вам было бы нужно следующее:

Label lblName = (Label) FindControlRecursive(Page, "lblName");

Используя этот метод обычно намного более удобно, поскольку Вы не должны знать точно, где управление находится для нахождения его (предположение, что Вы знаете идентификатор, конечно), хотя при вложении средств управления с тем же именем Вы, вероятно, получите некоторое странное поведение, так, чтобы могло бы быть что-то, чтобы не упустить.

23
ответ дан 5 December 2019 в 05:08
поделиться

Хотя я люблю рекурсию и соглашаюсь с andy и Mun, еще один подход, который можно хотеть рассмотреть, должен иметь страницу Master со строгим контролем типов. Все, что необходимо сделать, добавляет одна директива на aspx странице.

Вместо того, чтобы получить доступ к управлению страницы от Вашей основной страницы, рассмотрите доступ к управлению на Вашей основной странице от самой страницы. Этот подход имеет большой смысл, когда Вы имеете начальную метку на своей основной странице и хотите установить ее значение от каждой страницы, которая использует ведущее устройство.

Я не на 100% уверен, но я думаю, что это было бы более простой техникой с вложенными основными страницами, поскольку Вы просто укажете на VirtualPath на ведущее устройство, содержащее управление, к которому Вы хотите получить доступ. Это могло бы оказаться хитрым хотя, если Вы хотите получить доступ к двум средствам управления, один на каждой соответствующей основной странице.

4
ответ дан 5 December 2019 в 05:08
поделиться

Я использовал метод <% @ MasterType VirtualPath = "~ / MyMaster.master"%> . . У меня есть свойство на главной главной странице, а затем на главной странице сведений другое свойство с тем же именем, вызывающее основное свойство, и оно отлично работает.

У меня есть это на главной главной странице

 public string MensajeErrorString
    {
        set
        {
            if (value != string.Empty)
            {
                MensajeError.Visible = true;
                MensajeError.InnerHtml = value;
            }
            else
                MensajeError.Visible = false;
        }


    }

, это просто элемент div, который должен показывать сообщение об ошибке. Я хотел бы использовать это же свойство на страницах с главной страницей сведений (она вложена в главную мастер-страницу).

Затем в мастере деталей у меня есть это

  public string MensajeErrorString
    {
        set
        {
                Master.MensajeErrorString = value;
        }

    }

. Я вызываю главное свойство мастера из мастера деталей, чтобы создать такое же поведение.

1
ответ дан 5 December 2019 в 05:08
поделиться

У меня все работает идеально.

В contentpage.aspx я написал следующее:

If Master.Master.connectsession.IsConnected Then мой код находится здесь End If

0
ответ дан 5 December 2019 в 05:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: