2015-09-16 4 views
0

У меня есть Index.aspx, который несколько раз использует один пользовательский элемент управления «SocialElement» (с разными именами).Как получить информацию о других пользовательских элементах управления пользователя?

Я хочу обнаружить из этого пользовательского элемента управления «SocialElement» о том, сколько этого пользовательского элемента управления уже существует/загружается на странице индекса.

Ниже мой код:

index.aspx

<MyUserControl:SocialElement ID="Element" runat="server"/> 

    <MyUserControl:SocialElement ID="Element1" runat="server"/> 

    <MyUserControl:SocialElement ID="Element2" runat="server"/> 

код SocialElement.ascx позади

protected void Page_PreRender(object sender, EventArgs e) 
{ 
    var listSocialShare = Page.Controls.OfType<SocialElement>(); 
    int number = listSocialShare.Count(); 
} 

Однако, я увидел значение "числа" всегда равен нулю, когда каждый раз, когда SocialElement.ascx загружается Index.aspx.

Действительно ли я получаю общее количество SocialElement.ascx с "Page.Controls.OfType()"?

Если нет, то как? Спасибо.

+0

'Page.Controls' только для управления, которые являются прямыми потомками' Page'. Вам нужен рекурсивный алгоритм для итерации над дочерними детьми и т. Д. – mason

+0

Привет @mason, на моем веб-сайте я разрешаю Index.aspx использовать SocialElement.ascx, а другие не могут. – user3174976

+0

Это не меняет то, что я сказал в своем комментарии. Элементы управления находятся в иерархии, а свойство '.Controls' возвращает только дочерние элементы этого элемента управления, поэтому вам нужно написать алгоритм, который будет переписывать их и искать все уровни иерархии. – mason

ответ

0

@mason является правильным о необходимости рекурсивно искать контроль. Вам нужен способ для перебора всех элементов управления:

protected void Page_PreRender(object sender, EventArgs e) 
{ 
    var listSocialShare = FindControlsRecursive<SocialElement>(Page); 
    int number = listSocialShare.Count(); 
} 

private IEnumerable<T> FindControlsRecursive<T>(Control root) 
{ 
    foreach (Control child in root.Controls) 
    { 
     if (child is T) 
     { 
      yield return (T)Convert.ChangeType(child, typeof(T)); 
     } 

     if (child.Controls.Count > 0) 
     { 
      foreach (T c in FindControlsRecursive<T>(child)) 
      { 
       yield return c; 
      } 
     } 
    } 
} 
Смежные вопросы