我在项目中想将页面的textbox控件全部清空,控件很多逐个清空很繁杂,现在用foreach循环:
foreach (Control ctl in this.Controls)
if (ctl is TextBox)
{ ((TextBox)ctl).Text = " "; }
运行后不成功,跟总调试发现代码没有执行{ ((TextBox)ctl).Text = " "; }这个语句,而是来回的执行上面一部分,foreach (Control ctl in this.Controls)
if (ctl is TextBox),请各位博友帮忙分析。
用“foreach (Control ctl in this.Form.Controls)”试试。
哈哈,成功了,万分感谢!
那说明没有TextBox控件,你这个地方的this是什么?应该是this.Page.Controls吧?
我试试
还是不行呢,我感觉那个地方不用page的话,默认的话也是指当前页面的控件,我的当前页面肯定有textbox控件,而且所有的输入文本控件都是textbox控件,那为什么获取不到呢
@pengjw: 你把整个后台代码贴出来吧
@田林九村:
protected void btnCopy_Click(object sender, EventArgs e)
{
DAModel model = this.createModel();
DADAL dal = DALFactory.GetDAL(this.GetName());
//DA_AJModel ajModel = model as DA_AJModel;
//Int64 aa = Convert.ToInt64(ajModel.AJH.ToString().Trim());
//this.txtAJH.Text = Convert.ToString(aa + 1);
//ajModel.AJH = this.txtAJH.Text.ToString();
string message = string.Empty;
try
{
if (hidSaved.Value == "1")
{
dal.Update(model);
}
else
{
dal.Add(model);
hidSaved.Value = "1";
}
WriteLog(this.GetName());
message = "保存成功!";
this.AfterSave(model);
this.hidSaved.Value = "0";
Page.ClientScript.RegisterStartupScript(this.GetType(), "onClick", "<script>window.opener.__doPostBack('btnQuery','');</script>");
}
catch
{
WriteLogW(this.GetName());
Page.ClientScript.RegisterStartupScript(this.GetType(), "", "<script>window.alert('保存失败');</script>");
}
if (message == "保存成功!")
{
foreach (Control ctl in this.Page .Controls)
if (ctl is TextBox)
{ ((TextBox)ctl).Text = " "; }
//ClearAll();
}
这是if语句所在的方法,你先看看能不能分析呢
一个博友说this.Form.Controls,那样就可以了。谢谢!Form是一个控件,而Control ctl in this.Form .Controls这个语句是获取页面控件的子控件,这样可以理解啦!万分感谢!
foreach (Control ctl in this.form1.Controls)
if (ctl is TextBox)
{ ((TextBox)ctl).Text = " "; }
在我们将页面发送到服务器的时候,象一些没有runat="server"属性的控件是不发的,发送过去的控件就能用page对象用,
但是这是分层的
int num = Page.Controls.Count;
for (int i = 0; i < num; i++)
{
Response.Write(Page.Controls[i].ToString() + "<br>");
}
这样可以看到第一层,一般就System.Web.UI.HtmlControls.HtmlHead和System.Web.UI.HtmlControls.HtmlForm,有时有空格会有System.Web.UI.LiteralControl,所以要找到HtmlForm的索引,一般是1,我们这里就当成1先用
foreach (Control ctl in Page.Controls[1].Controls)
{
if (ctl.GetType().Name == "TextBox")
{
TextBox tb = new TextBox();
tb = (TextBox)this.FindControl(ctl.ID);
tb.Text = "";
}
}
其实这种方式只能够将form表单中第一层的控件中的textbox清空,
补:
给你一个好东西,用递归写的通用的
public void ClearText(Control page)
{
if (page.HasControls())
{
foreach (Control control in page.Controls)
{
if (control is TextBox)
{
(control as TextBox).Text = "";
}
ClearText(control);
}
}
}
调用这个方法就行ClearText(this.Page);
给你个看看页面控件层次
string text = "";
public void ClearText(Control page)
{
if (page.HasControls())
{
text = text + " ";
foreach (Control control in page.Controls)
{
Response.Write(text+control.ToString()+"<br>");
ClearText(control);
}
text = text.Substring(0, text.Length - 24);
}
}