ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание - Эндрю Троелсен
Шрифт:
Интервал:
Закладка:
Таблица 23.5. Подборка членов System.Web.UI.Control
Член Описание Controls Свойство, получающее объект ControlCollection, представляющий дочерние элементы управления в рамках данного элемента управлений DataBind() Метод, выполняющий привязку источника данных к вызванному серверному элементу управления и всем его дочерним элементам управления EnableTheming Свойство, указывающее возможность поддержки тем для данного элемента управления HasControls() Метод для определения наличия дочерних элементов управления у данного серверного элемента управления ID Свойство, читающее или устанавливающее значение программного идентификатора для серверного элемента управления Page Свойство, получающее ссылку на экземпляр типа Page, содержащий серверный элемент управления Parent Свойство, получающее ссылку на родительский элемент управления данного серверного элемента управления в иерархии элементов управления страницы SkinID Свойство, читающее или устанавливающее параметры скиннинга элемента управления. Это дает возможность в ASP.NET 2.0 устанавливать внешний вид элемента управления динамически Visible Свойство, читающее или устанавливающее значение, указывающее необходимость обработки серверного элемента управления, как элемента пользовательского интерфейса страницыСписок вложенных элементов управления
Первой из рассматриваемых здесь Особенностей 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. Перечень вложенных элементов
Динамическое добавление (и удаление) элементов управления
Но что делать, если нужно изменить содержимое 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;
}
Запустив приложение, вы сможете увидеть как содержимое текстовых блоков, так и довольно длинные ("нечитаемые") строки. Такие строки отражают визуальное состояние элементов на странице и будут рассматриваться позже, в следующей главе. Также вы заметите, что после обработки запроса новые текстовые окна исчезают. Причина опять кроется в природе HTTP – этот протокол не обеспечивает сохранения состояния. Чтобы динамически созданные типы TextBox сохранялись после вторичных запросов, вы должны сохранить состояния этих объектов, используя соответствующие приемы программирования ASP.NET (эти вопросы также рассматриваются в следующей главе).
Исходный код. Файлы примера DynamicCtrls размещены в подкаталоге, соответствующем главе 23.
Основные члены типа System.Web.Ul.WebControls.WebControl
Можно сказать, что тип Control предлагает возможности поведения, не относящиеся к графическому интерфейсу. С другой стороны, базовый класс WebControl обеспечивает полиморфный графический интерфейс для всех Web-элементов поведения, как показано в табл. 23.10.
Таблица 23.10. Свойства базового класса WebControl
Свойства Описание BackColor Читает или устанавливает цвет фона Web-элемента управления BorderColor Читает или устанавливает цвет границы Web-элемента управления BorderStyle Читает или устанавливает стиль границы Web-элемента управления BorderWidth Читает или устанавливает ширину границы Web-элемента управления Enabled Читает или устанавливает значение, являющееся индикатором доступности Web-элемента управления СssСlass Позволяет назначить Web-элементу управления класс, определенный в рамках CSS (Cascading Style Sheet – каскадная таблица стилей) Font Читает информацию о шрифте для Web-элемента управлений ForeColor Читает или устанавливает цвет изображения (обычно цвет текста) для Web-элемента управления Height Width Читает или устанавливает высоту и ширину Web-элемента управления TabIndex Читает или устанавливает индекс перехода по табуляции для Web-элемента управления ToolTip Читает или устанавливает значение-индикатор, указывающее необходимость отображения подсказки при задержке указателя мыши на изображении Web-элемента управленияСкорее всего, эти свойства будут для вас понятны, так что вместо примеров их использования давайте немного сместим акценты и проверим в действии ряд элементов управления Web-формы ASP.NET.