Объекты LiteralControl предоставляют немногое в отношении функциональности. Например, вы не можете устанавливать информацию, связанную со стилями, наподобие цвета и шрифта. У них также нет уникальных серверных идентификаторов. Однако, вы можете манипулировать содержимым LiteralControl с использованием его свойства Text. В следующем коде приведенный ранее пример переписан так, чтобы он проверял литеральные элементы управления и при их наличии приводил базовый объект Control к типу LiteralControl для извлечения связанного текста:
foreach (Control control in Page.Controls)
{
Response.Write(control.GetType().ToString() + " - <b>" + control.ID +"</b><br />");
if (control is LiteralControl)
{
// Отобразить содержимое литерального элемента
// управления (включая пробелы).
Response.Write("*** Text: " + ((LiteralControl)control).Text + "<br />");
}
}
Response.Write("<hr>");
В этом примере все еще присутствует проблема. Теперь все понятно с неожиданным содержимым, но пока неясно насчет отсутствующего содержимого, а именно — других объектов элементов управления страницы?
Для ответа на этот вопрос следует понимать, что ASP.NET генерирует страницу иерархически. Она генерирует непосредственно только верхний уровень элементов управления. Если эти элементы управления содержат другие элементы управления, они предоставляют свои собственные свойства Controls, предоставляющие доступ к их дочерним элементам управления. На странице-примере, как и во всех Web-формах ASP.NET, все элементы управления вложены в дескриптор <form>. Это означает, что необходимо исследовать коллекцию Controls класса HtmlForm для получения информации о серверных элементах управления страницы.
Однако необязательно поступать настолько прямолинейно, поскольку не существует ограниченного количества уровней вложенных элементов управления. Чтобы действительно решить эту проблему и отобразить все элементы управления страницы, потребуется создать рекурсивную программу, которая будет совершать полный обход дерева элементов управления.
Ниже представлено полное решение:
public partial class ControlTree : System.Web.UI.Page
{
protected void Page_Load(object sender, System.EventArgs e)
{
// Начало просмотра всех элементов управления.
DisplayControl(Page.Controls, 0);
// Добавление завершающей горизонтальной линии.
Response.Write("<hr/>");
}
предыдущая следующая страница оглавление
127