更新:2007 年 11 月
页上的每个容器控件和页本身都具有可用于定位到各个控件的 Controls 集合。
在 Controls 集合中定位控件
依次通过容器控件的 Controls 集合。该集合的类型为 ControlCollection,它返回 Control 类型的对象。
下面的示例说明如何浏览 Controls 集合。该示例假定 ASP.NET 网页上至少有一个 TextBox 控件,还包含一个 Label 控件和一个 Button 控件。该代码会获取 Page 对象的所有子控件。由于这样只会产生几个高级别子控件(包括 HtmlForm 对象),所以该代码还要浏览每个单独的子控件的 Controls 集合。该代码会通过比较每个控件的类型来查找文本框。当它找到文本框时,它会获取该文本框的值并将该值串联成字符串,该字符串会显示在 Label 控件的末尾。
此示例只查找 Page 对象中包含的控件以及作为该页的直接子级的控件。如果文本框是控件的子级,而该控件又是页的子级,则该示例不查找此文本框。例如,如果您向该页中添加了 Panel 控件,则 Panel 控件将是包含在 Page 中的 HtmlForm 控件的子级,在此示例中可以找到该控件。然而,如果您之后将某个 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; } }