Список вложенных элементов управления

Список вложенных элементов управления

Первой из рассматриваемых здесь Особенностей System.Web.UI.Control является то, что все Web-элементы управления (это также относится и к Page) наследуют коллекцию пользовательских элементов управления (доступную с помощью свойства Controls). Во многом аналогично случаю приложений Windows Forms, в данном случае свойство Controls обеспечивает доступ к строго типизованной коллекции объектов WebControl. Подобно любой коллекции .NET, вы имеете возможность динамически добавлять и удалять элементы этой коллекции в среде выполнения.

Хотя добавлять Web-элементы управления в Page-тип можно и непосредственно, намного проще (и безопаснее) использовать для этого элемент управления Panel. Класс System.Web.UI.WebControls.Panel представляет контейнер элементов управления, который может быть видимым или невидимым для конечного пользователя (в зависимости от значений свойств Visible и BorderStyle).

Для примера создайте новый Web-узел с названием DynamicCtrls. В окне проектирования Web-страницы Visual Studio 2005 добавьте тип Panel (назначив ему имя myPanel), содержащий элементы TextBox, Button и HyperLink с произвольными именами (учтите, что режим проектирования требует, чтобы при перетаскивании внутренние элементы помещались в зону интерфейса типа Panel). В результате элемент ‹form› вашего файла *.aspx должен принять следующий вид.

asp:Panel ID="myPanel" runat="server" Height="50px" Width="125px"›

 asp:TextBox ID="TextBox1" runat="server"›‹/asp:TextBox›‹br /›

 asp:Button ID="Button1" runat="server" Text="Кнопка" /›‹br /›

 ‹asp:HyperLink ID="HyperLink1" runat="server"›Гиперссылка‹/asp:HyperLink›

‹/asp:Panel

Затем разместите элемент Label (с названием lblControlInfo) вне контекста Panel, чтобы отображать соответствующий вывод. Учтите в Page_Load() то, что мы хотим получить список всех элементов управления, содержащихся в Panel, и присвоить полученные результаты типу Label.

public partial class _Default: System.Web.UI.Page {

 protected void Page_Load(object sender, EventArgs e) {

  ListControlsInPanel();

 }

 private void ListControlsInPanel() {

  string theInfo;

  theInfo = String.Format("Присутствие элементов: {0}‹br›", myPanel.HasControls());

  foreach (Control с in myPanel.Controls) {

   if (c.GetType() != typeof(System.Web.UI.LiteralControl)) {

    theInfo += "***************************‹br›";

    theInfo += String.Format("Name = {0}‹br›", с.ToString());

    theInfo += String.Format("ID = {0}‹br›", c.ID);

    theInfo += String.Format("Visible = {0}‹br›", c.Visible);

    theInfo += String.Format("ViewState = {0}‹br›", c.EnableViewState);

   }

  }

  lblControlInfo.Text = theInfo;

 }

}

Здесь выполняется цикл по всем типам WebControl, поддерживаемым в Panel, и осуществляется проверка того, что текущий тип не является типом System.Web.UI.LiteralControl. Этот тип используется для представления буквальных HTML-дескрипторов и содержимого (например, ‹br›, текстовых литералов и т.д.). Если вы не выполните такой проверки, вы с удивлением можете обнаружить в контексте Panel целых семь типов (для указанного выше определения *.aspx). В предположений о том, что тип не является буквальным HTML-содержимым, выводится определенная статистическая информация, Пример такого вывода показан на рис. 23.20.

Рис. 23.20. Перечень вложенных элементов