原以为很简单的东西,做了才知道不是那么回事啊! (遍历页面中的控件)
前段时间在闭关充电,这几天出关了,于是继续开始毕业设计之旅。
这次是做一个用户注册页面,布局是利用table,控件主要用label ,textbox和button,需要用户输入12项资料,然后按“提交”按钮,经过验证无误后插入数据库。
还有一个“重置”按钮。
首先,我的设想是用 javascript 和 服务器端验证结合,关于JS的话,还是等下次总结吧。
我先验证 所有textbox是不是有空的,如果有空,就提示用户必须填写完毕,问题就出在 遍历所有textbox控件 这里!
当时我写的代码大概如下,经历了几次修改,不过基本思路都没变
protected void Button1_Click(object sender, EventArgs e) { bool IsOK = true; foreach (Control c in this.Controls) { if (c.GetType() == typeof(TextBox)) { if (c as Textbox).Text == "") { IsOK = false; } } } if (IsOK == false) { Response.Write("<script>alert('请填写完所有资料');</script>"); } //database utility goes here~ }
虽然我觉得这代码应该没问题,不过确实很打击人啊,浏览器弄死都没alert出来个窗口
在我调试的时候,我发现程序重来就没有进入过如下这个循环:
if (c.GetType() == typeof(TextBox)) { if (c as Textbox).Text == "") { IsOK = false; } }
也就是说,根本就没找到过一个类型为TextBox的控件!
我仔细看看,发现了有时候能找到System.Web.UI.LiteralControl,不知道是什么东西,等下来有空再去查资料。
我到网上找过遍历控件方面的文章,可发现他们的代码和我的思路一样,真不知道是我悲剧还是那些人作假?
最后看到有人说要用递归来做,但那人既没说清楚思路,也没上代码。
最后我鼓捣了半天,终于弄好了。
===================================我是分割线===================================
为了测试,我在页面上放了一个label,修改了页面的代码,让程序在某label上输出具体哪个TextBox是空的,空的是0,非空用1表示,
所以要输出一串12个字符的string.
1,页面加载的时候要先清空 label
protected void Page_Load(object sender, EventArgs e) { lblss.Text = ""; }
2,下面这个方法实现返回那个字符串,确定哪些textbox是空的,是测试成功与否的指示
public string SubmitInfo(ControlCollection cc) { string s = ""; foreach (Control c in cc) { if (c.HasControls()) { SubmitInfo(c.Controls); } else { if (c.GetType() == typeof(TextBox)) { if ((c as TextBox).Text == "") { lblss.Text += "0"; } else { lblss.Text += "1"; } } } } return s; }
3,根据上面方法返回的 string,如果包含有"0",就可以确定页面有空白的textbox,以及到底那个位置是空的(如果愿意,更可以动态提示用户“XX信息不为空”),
代码就不上了。
最后说点:动手之前我是很有信心的,认为遍历所有控件很简单,结果花了几个小时才搞定,╮(╯▽╰)╭
还有,网上很多资料都是忽悠人的,不能再轻易相信了。
特此总结,以备日后查看。