日期:2014-05-18  浏览次数:20392 次

如何高效率遍历页面所有的web控件
现在有个需求,要遍历页面所有的web控件如textbox,radiobutton等等,然后改变一些属性(textbox让它readonly=true,其它的enableviewstate=false)
目前想到方法有:
1.手写,一个个的写。这个最笨,代码多
2.由于有的control下面又带有control,如updatepanel等。所以要用递归来获取,但是这样效率太低,已经试过,决定放弃。

有没有更好的方法?

------解决方案--------------------
/// <summary>
/// 得到页面控件集合字符串
/// </summary>
/// <returns> 返回页面控件名字符串 </returns>
public string GetPageControlsCount()
{
string formContorls = " ";
int len = Form.Controls.Count;
for (int i = 0; i < len; i++)
{
formContorls += Form.Controls[i].ClientID.ToString();
}
return formContorls;
}
------解决方案--------------------
递归,控件树也是递归的


void disableControl(Control c)
{
if(c is TextBox )
if(c is RadioButton)
if(c is abc )
if (c.HasControls)
{
foreach (control cc in c.Controls){
disableControl(cc)
}

}

}


调用page中
disableControl((control)this);
------解决方案--------------------
1. 遍历嵌套层级控件:
for (int i =0; i <Panel1.Controls.Count;i++)
{
if(Panel1.Controls[i] is CustomerPanel)//CustomerPanel是个自定义控件
{
CustomerPanel p1=(CustomerPanel)Panel1.Controls[i];
for(int j=0;j <p1.Controls.Count;j++)
{
if(p1.Controls[j] is Panel)
{
Panel p2=(Panel)p1.Controls[j];
for(int k=0;k <p2.Controls.Count;k++)
{
if(p2.Controls[k] is RadioButtonList)
{
Response.Write( " <script> alert( ' " + ((RadioButtonList)p2.Controls[k]).SelectValue " '); </script> ");
}

}
}
}
}
}

2.遍历当前窗口中所有的控件:
foreach(Control ctl in this.Controls[1].Controls)
{
if(ctl.GetType().Name== "TextBox ")
{
TextBox tb =new TextBox();
tb=(TextBox)this.FindControl(ctl.ID);
Response.Write( " <script> alert( ' " + tb=.Text+ "的值为空。 '); </script> ");
}
}
}

------解决方案--------------------
foreach(Control control in this.Controls){
if(control is TextBox){
TextBox txt = control as TextBox;
txt.ReadOnly = false;
}
}
------解决方案--------------------
效率低吗?是不是一个一个要执行显示转化判断是否为想要的控件类型造成的?感觉最好的方法还是对控件的值绑定到数据字段上,而控件的状态控制在加载时根据控制字段的值进行控制。这样只需要对字段做操作即可