今天碰到了一个新的问题:在GridView的编辑状态下,如何对单元格内修改后的数据进行验证?
首先贴上一个在论坛上淘的正则:
function
Check(a) {
var re = / ^([1-9][0-9]*|0)(\.[0-9]+)?$ / ;
return re.exec(a) != null ;
}
//这个正则验证的字符串为:纯数字,一个小数点,非0开头,非空。
var re = / ^([1-9][0-9]*|0)(\.[0-9]+)?$ / ;
return re.exec(a) != null ;
}
GridView控件中的数据验证难在单元格内的控件ID是页面生成后产生的,虽然也可以通过控件所在的行列序号来获取ID,但对我这个菜鸟来说还是有点复杂。
怎么办呢,一番思索,我想到了也许可以在this参数上做文章,于是我在GOOGLE查询JS中this参数的用法。结果在第一个搜索结果中就得到了下面这句话
在JavaScript中,this通常指向的是我们正在执行的函数本身,或者是指向该函数所属的对象(运行时)。
后半句提醒了我,我马上有了思路。
做法如下:
- 将GRIDVIEW中需要在修改时验证的列改为模板列。
- 在前端代码中修改模板列中的控件属性
<
EditItemTemplate
>
<
asp:TextBox
ID
="TextBox1"
runat
="server"
Text
='<%#
Bind("Amount") %
>
' οnblur="amountcheck(this)" Width="40">
</
asp:TextBox
>
</
EditItemTemplate
>
//this参数传入了控件的对象,替代了通过控件ID获取控件对象这一步
- 添加JS代码
function
amountcheck(tb) {
if ( ! Check(tb.value)) {
alert( " 请输入正确的数量! " );
tb.focus();
}
}
if ( ! Check(tb.value)) {
alert( " 请输入正确的数量! " );
tb.focus();
}
}
好了,现在GridView中的单元格在失去焦点时,就会触发验证,并且在用户没有输入符合要求的值之前,这将是一个死循环(有点霸道,不是好的处理方式)。