Практическое руководство. Нахождение элементов управления Web Forms на странице в коллекции Controls
Обновлен: Ноябрь 2007
Каждый элемент управления на странице, а также сама страница, имеют коллекцию Controls, используемую для получения отдельных элементов управления.
Нахождение элементов управления в коллекции Controls
Просмотрите коллекцию Controls элемента управления контейнером. Коллекция относится к типу ControlCollection и возвращает объекты типа Control.
В следующем примере показано, как просматривать коллекцию Controls. В этом примере предполагается, что ASP.NET страница Web Forms имеет хотя бы один элемент управления TextBox, Label и Button. Код получает все дочерние элементы управления объекта Page. Поскольку в результате будет получено немного дочерних элементов управления высокого уровня, включая объект HtmlForm, код также просматривает коллекцию Controls каждого отдельного дочернего элемента управления. Код ищет текстовые поля путем сравнения типов всех элементов управления. При нахождении текстового поля он получает значение этого элемента управления и объединяет его в строку, отображаемую в конце элемента управления Label.
В этом примере выполняется поиск только элементов управления, содержащихся в объекте Page, а также элементов управления, являющихся прямыми потомками страницы. Поиск текстовых полей, дочерних для элемента управления, который, в свою очередь, является дочерним для страницы, не выполняется. Например, если перетащить элемент управления Panel в конструктор, то элемент управления Panel будет дочерним по отношению к элементу управления HtmlForm, содержащемуся в Page, как будет показано в приведенном ниже примере. Но если затем перетащить элемент управления TextBox в элемент управления Panel, то текст элемента управления TextBox не будет отображен в этом примере, поскольку он не является дочерним для страницы или для дочернего элемента управления страницы. Более практичным применением просмотра элементов управления этим способом является создание рекурсивного метода, вызываемого при просмотре коллекции Controls для каждого элемента управления по мере его обнаружения. Однако для ясности в приведенном ниже примере рекурсивная функция не создается.
Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click Dim allTextBoxValues As String = "" Dim c As Control Dim childc As Control For Each c In Page.Controls For Each childc In c.Controls If TypeOf childc Is TextBox Then allTextBoxValues &= CType(childc, TextBox).Text & "," End If Next Next If allTextBoxValues <> "" Then Label1.Text = allTextBoxValues End If End Sub
private void Button1_Click(object sender, System.EventArgs e) { string allTextBoxValues = ""; foreach (Control c in Page.Controls) { foreach (Control childc in c.Controls) { if (childc is TextBox) { allTextBoxValues += ((TextBox)childc).Text + ","; } } } if (allTextBoxValues != "") { Label1.Text = allTextBoxValues; } }