- /// <summary>
- /// 遍历页面控件 当控件名为 classid 则显示该控件
- /// </summary>
- /// <param name="ctl">页面</param>
- /// <param name="classid">控件名</param>
- private void Set_Controls(Control ctl, string classid,bool visb)
- {
- if (ctl is DataList)
- {
- foreach (Control c in ctl.Controls)
- {
- foreach (Control cc in c.Controls)
- {
- if (cc.ID == classid)
- {
- cc.Visible = visb;
- }
- else
- {
- // cc.Visible = false;
- }
- }
- }
- }
- else
- {
- //当控件没有子控件时
- if (!ctl.HasControls())
- {// 控件在 页面根节点下 不在其他容器内
- if (ctl.ID == classid)
- {
- ctl.Visible = visb;
- }
- else
- {
- // ctl.Visible = false;
- }
- }
- else //当控件有子控件时
- {
- int i = 0;
- while (i < ctl.Controls.Count)
- {
- Set_Controls(ctl.Controls[i], classid,visb);
- i++;
- }
- }
- }
- }
第一种,遍历this.Controls
代码如下:
foreach
(Control ctl
in
this
.Controls)
{ if (typeof(ctl)==typeof(TextBox)).
{ if (typeof(ctl)==typeof(TextBox)).
这样并不能遍历整个页面中的TextBox
- this.Controls只是包含了Page根一级的control,这样次级的control就都没有遍历
- TextBox一般会放在form里面,遍历this.Controls只会访问form control,而不会访问form的子contorl,其中的TextBox
第二种,遍历Controls[1]
代码如下:
for
(
int
i
=
0
;i
<
inPage.Controls[
1
].Controls.Count;i
++
)
{
if(inPage.Controls[1].Controls[i].GetType().ToString()=="System.Web.UI.WebControls.TextBox")
{
if(inPage.Controls[1].Controls[i].GetType().ToString()=="System.Web.UI.WebControls.TextBox")
同样的情况:
- 这种代码没有通用性,你怎么就知道Control[1]正是你要遍历的collection
- 次级的control都没有遍历
我认为正确的做法:使用递归对页面control树进行完全遍历,并对每一个control进行处理。递归算法如下:
- 传入page的this.Colletions
- 对每一个contorl,如果contorl没有包含子control,进行处理。
- 如果包含,递归调用这个函数处理子control
private
void
InitialControl(ControlCollection objControlCollection)
{
foreach (System.Web.UI.Control objControl in objControlCollection)
{
if (objControl.HasControls())
{
InitialControl(objControl.Controls);
}
else
{
if (objControl is System.Web.UI.WebControls.TextBox)
{
((TextBox)objControl).Text = String.Empty;
}
}
}
}
{
foreach (System.Web.UI.Control objControl in objControlCollection)
{
if (objControl.HasControls())
{
InitialControl(objControl.Controls);
}
else
{
if (objControl is System.Web.UI.WebControls.TextBox)
{
((TextBox)objControl).Text = String.Empty;
}
}
}
}
附案例:
- using System;
- using System.Data;
- using System.Configuration;
- using System.Collections;
- using System.Web;
- using System.Web.Security;
- using System.Web.UI;
- using System.Web.UI.WebControls;
- using System.Web.UI.WebControls.WebParts;
- using System.Web.UI.HtmlControls;
- public partial class alltextbox : System.Web.UI.Page
- {
- protected void Page_Load(object sender, EventArgs e)
- {
- Label1.Text = TextBox1.GetType().ToString();
- }
- /// <summary>
- ///
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- protected void Button1_Click(object sender, EventArgs e)
- {
- Set_Controls(this.Page);
- }
- private void Set_Controls(Control ctl)
- {
- //当控件没有子控件时
- if (!ctl.HasControls())
- {
- switch (ctl.GetType().ToString())
- {
- case "System.Web.UI.WebControls.Label":
- break;
- case "System.Web.UI.WebControls.TextBox":
- ((TextBox)ctl).Text="xzz";
- break;
- case "System.Web.UI.WebControls.DropDownList":
- ((DropDownList)ctl).SelectedIndex = -1;
- break;
- }
- }
- else //当控件有子控件时
- {
- int i = 0;
- while (i < ctl.Controls.Count)
- {
- Set_Controls(ctl.Controls[i]);
- i++;
- }
- }
- }
- }
附例: 查找datalist中 ID为指定的控件