2013-03-30 4 views
0

Я определил таблицу html не с asp-тегами один на моей странице *.aspx. Затем я добавил некоторые элементы управления asp в эту таблицу в своих строках как: <asp:CheckBox>.Не могу перечислить элементы управления в CodeBehind

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

В CodeBehind Я хотел перечислить все элементы управления, чтобы найти, что мне нужно, GetType().Name, а затем добавить во временный список для будущих действий.

Но у меня проблемы, в отладчике я не вижу никаких флажков, а количество элементов управления очень мало.

Я перечисляя элементы управления страницы, как это:

foreach (var item in Page.Controls) 
{ 
    if (item.GetType().Name == "CheckBox") 
    { 
     CheckBox checkBox = item as CheckBox; 

     if (checkBox.ID != null && checkBox.ID != String.Empty && checkBox.Checked) 
     { 
      arrayDocs.Add(checkBox.ID); 
     } 
    } 
} 

Полный код моей страницы:

ASPX: http://pastebin.com/gUs2LchL

код позади: http://pastebin.com/5tfnKJSt

+1

Если вы хотите перечислить элементы _all_ на странице, вам нужно сделать это рекурсивно. – Magnus

+0

Я отредактировал ваш заголовок. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

+0

@ Магнус рекурсивно? 23, рекурсия имеет повторяющиеся шаги, попытайтесь представить, как она может быть медленной? даже если вы используете tail-recursion, я полагаю, что любой элемент управления на asp-странице находится в некотором Control-Container, который вы можете перечислить с помощью блока foreach(). Основной вопрос в этом разделе заключается в том, что я не могу ссылаться на контейнер, который содержит все флажки для их перечисления, а также не может быть загружен из основного 'Page.Controls' или' this.Controls', что скорее Штанга. Я полагаю, что эти флажки находятся в режиме управления на стороне сервера, но я пытался получить элементы - нет успеха, тот же результат – Secret

ответ

0

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

Если вы хотите создать коллекцию всех элементов управления на странице, вам потребуется рекурсивно прокрутить элементы управления, чтобы добавить их дочерние элементы управления и т. Д. - как правильно указал Магнус.

Самый эффективный/эффективный способ - собрать коллекцию из родительского контейнера флажков, в этом случае ячейки HtmlTable «tableDocs».

Change-

foreach (var item in Page.Controls) 

To-

foreach (var item in tableDocs.Controls) 

Тогда вам нужно рекурсивно перебрать ребенка управляет, по меньшей мере, два уровня (строка -> клетки -> флажков), прежде чем вы получите на флажках.

Что может быть гораздо более простым в использовании дженериков и создании типированного списка CheckBox, содержащего все флажки, которые вы хотите проверить.

Что-то как-

var checkboxes = new List<CheckBox>{checkboxAuctionHistory, checkboxBackSaldo, checkboxBalanceDecrypted}; //And so on 

    foreach (var checkbox in checkboxes) 
    { 
     if (!string.IsNullOrWhiteSpace(checkbox.ID) && checkbox.Checked) 
      { 
       arrayDocs.Add(checkbox.ID); 
      } 
     } 
    } 

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

Альтернативно перемещать флажки из таблицы или удалять из нее атрибут runat = "server", удаляя таблицу из дерева управления ASP.NET и делая контейнер для флажков "form1".

Большая часть другой разметки на странице не имеет runat = "server", и поэтому эти элементы не являются частью ASP.Дерево управления NET.

Смежные вопросы