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. Перечень вложенных элементов
Динамическое добавление (и удаление) элементов управления
Но что делать, если нужно изменить содержимое Panel в среде выполнения? Соответствующий процесс должен показаться вам очень знакомым, если вы внимательно прочитали материал книги, посвященный работе с Windows Forms. Давайте добавим в текущую страницу кнопку (с названием btnAddWidgets), которая будет динамически добавлять в Panel пять новых типов TextBox, и еще одну кнопку, которая будет выполнять очистку Panel от всех элементов управления. Обработчики событий Click для этих кнопок приведены ниже.
protected void btnAddWidgets_Click(object sender, EventArgs e) {
for (int i = 0; i ‹ 5; i++) {
// Назначение имени, чтобы позже получить соответствующее
// текстовое значение с помощью метода
// HttpRequest.QueryString.
TextBox t = new TextBox;
t.ID = string.Format("newTextBox{0}", i);
myPanel.Controls.Add(t);
ListControlsInPanel;
}
}
protected void btnRemovePanelItems_Click(object sender, EventArgs e) {
myPanel.Controls.Clear;
ListControlsInPanel;
}
Обратите внимание на то, что каждому TextBox назначается уникальное значение ID (newTextBox1, newTextBox2 и т.д.), чтобы можно было программными средствами получить содержащийся в этих элементах текст, используя коллекцию HttpRequest.Form (как будет показано чуть позже).
Чтобы получить значения этих динамически генерируемых типов TextBox, добавьте в пользовательский интерфейс еще один тип Button и тип Label. В пределах обработчика события Click для Button реализуйте цикл по всем элементам, содержащимся в рамках типа HttpRequest.NameValueCollection (доступного с помощью HttpRequest.Form), добавляя полученную текстовую информацию к локальному типу System.String. По завершении обработки коллекции назначьте эту строку свойству Text нового элемента Label с именем lblTextBoxText.
protected void btnGetTextBoxValues_Click(object sender, System.EventArgs e) {
string textBoxValues = "";
for(int i = 0; i ‹ Request.Form.Count; i++) {
textBoxValues += string.Format("‹li›{0}‹/li›‹br›", Request.Form[i]);
}
lblTextBoxText.Text = textBoxValues;
}