2010-09-15 4 views
0

У меня есть элемент управления входами, и он вложен в глубину 2 в заголовке управления i.e Страница -> Управление заголовком -> Контроль входа. Я не могу получить ссылку на элемент управления на странице с помощью FindControl. Я хочу, чтобы иметь возможность установить видимое свойство элемента управления, какASP.NET Как получить доступ к глубоко вложенному элементу управления пользователя на родительской странице

if (_loginControl != null) 
      _loginControl.Visible = false; 

Я закончил с использованием рекурсивного метода FindControl найти вложенное управление.

public static Control FindControlRecursive(Control root, string id) 
    { 
     if (root.ID == id) 
     { 
      return root; 
     } 

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

     return null; 
    } 
+0

я не уверен, что вы имеете в виду, когда вы говорите, тест, если он существует? Вы добавляете его динамически на страницу? Если вы объявили его в своей разметке, он должен иметь идентификатор и 'runat =" server ", чтобы вы могли просто ссылаться на него по идентификатору, и он всегда должен быть заполнен. – Josh

ответ

0

Вы необходимость отключить/скрыть пользовательский элемент управления на странице ASP.NET она находится на (или действительно существует пользовательский элемент управления на главной странице, например)? Если он находится в одной и той же странице, а затем на странице ASP.NET в коде-за вы могли бы сделать:

MyUserControlsID.Visible = false 

Где MyUserControl является идентификатор вашего пользовательского элемента управления. Чтобы определить идентификатор пользователя вашего взгляда управления в разметке вашей страницы .aspx, и вы увидите что-то вроде этого:

<uc1:UserControlName ID="MyUserControlsID" runat="server" ... /> 

С Днем программирования!

+0

Спасибо Скотту, я использовал FindControl, но не использовал правильный идентификатор из декларативного кода. Все здесь верны, спасибо. Я буду нести оговорки в виду Джоша. – Brendan

+0

Если пользовательский элемент управления находится на самой странице ASP.NET, вам не нужно использовать FindControl. Вы должны иметь возможность ссылаться на него из класса кода, как и любой другой веб-элемент управления, то есть MyUserControlsID. –

+0

Фактически его элемент управления в элементе управления на странице, поэтому его идентификатор находится в ascx. Мне нужно использовать FindControl. – Brendan

0

Хороший способ будет использовать:

Page.FindControl() 

если что дает нуль, контроль не существует.

+0

Да, но FindControl принимает идентификатор в виде строки. Каков идентификатор пользовательского элемента управления? – Brendan

+0

Здесь много предостережений. 'FindControl' не является рекурсивным. Если элемент управления глубоко вложен, это не сработает. Кроме того, они должны делать это только в том случае, если элемент управления был добавлен динамически. – Josh

+0

Идентификатор вашего пользовательского элемента управления - это то, что вы установили идентификатор, который должен быть через окно «Свойства» (или через декларативную разметку на вашей странице .aspx). Точно так же, как TextBox или Button имеет идентификатор, пользовательский элемент управления также имеет идентификатор. –

0

Элемент управления доступом, если он зарегистрирован в разметке, также будет членом экземпляра вашей страницы кода; вы можете ссылаться на него из класса codebehind, как если бы это был обычный член, используя то же имя, которое вы предоставили в качестве идентификатора (я рекомендую использовать codebehinds для большей части логики, а не для наложения кода в разметке, BTW).

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

0
private List<Control> GetAllNestedUserControl(Control ph) 
    { 
     List<Control> Get = new List<Control>(); 
     foreach (var control in ph.Controls) 
     { 
      if (control is UserControl) 
      { 
       UserControl uc = control as UserControl; 
       if (uc.HasControls()) 
       { 
        Get = GetAllNestedUserControl(uc); 

       } 
      } 
      else 
      { 
       Control c = (Control)control; 
       if (!(control is LiteralControl)) 
       { 
        Get.Add(c); 
       } 
      } 
     } 
     return Get; 
    } 

просто называют этот код от вас любой родительской страницы, а затем получить какой-либо контроль с помощью следующего кода

 List<Control> Get = GetAllNestedUserControl(ph); 
     Label l = (Label)Get.Find(o => o.ID == "lblusername"); 
     l.Text = "changed from master";