Во-первых, необходимо знать, что 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
Нахождение средств управления является болью, и я использовал этот метод, который я получил из блога 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");
Используя этот метод обычно намного более удобно, поскольку Вы не должны знать точно, где управление находится для нахождения его (предположение, что Вы знаете идентификатор, конечно), хотя при вложении средств управления с тем же именем Вы, вероятно, получите некоторое странное поведение, так, чтобы могло бы быть что-то, чтобы не упустить.
Хотя я люблю рекурсию и соглашаюсь с andy и Mun, еще один подход, который можно хотеть рассмотреть, должен иметь страницу Master со строгим контролем типов. Все, что необходимо сделать, добавляет одна директива на aspx странице.
Вместо того, чтобы получить доступ к управлению страницы от Вашей основной страницы, рассмотрите доступ к управлению на Вашей основной странице от самой страницы. Этот подход имеет большой смысл, когда Вы имеете начальную метку на своей основной странице и хотите установить ее значение от каждой страницы, которая использует ведущее устройство.
Я не на 100% уверен, но я думаю, что это было бы более простой техникой с вложенными основными страницами, поскольку Вы просто укажете на VirtualPath на ведущее устройство, содержащее управление, к которому Вы хотите получить доступ. Это могло бы оказаться хитрым хотя, если Вы хотите получить доступ к двум средствам управления, один на каждой соответствующей основной странице.
Я использовал метод <% @ 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;
}
}
. Я вызываю главное свойство мастера из мастера деталей, чтобы создать такое же поведение.
У меня все работает идеально.
В contentpage.aspx я написал следующее:
If Master.Master.connectsession.IsConnected Then
мой код находится здесь
End If