VS10中有关ClientID属性的小BUG

VS10中有关ClientID属性的小BUG

      

    前几天用VS08写了个程序,因为临时有事儿程序没执行就关了,后来不小心直接用VS10打开了,结果程序执行出现错误了,刚开始以为程序本身写的有问题,找了半天原因最后发现是VS10本身的一个小Bug,写出来和大家分享一下,免得学习.Net同学也遇到相同问题而耽误时间。     程序本身很简单,用ListView实现商品信息的增删改,在<InsertItemTemplate><EditItemTemplate>模板中实现在单价文本框或数量文本框发生onblur事件时让总金额文本框自动显示计算结果。在ListViewItemCreated事件中先取得单价数量文本框,TextBoxPriceTextBox= (TextBox)e.Item.FindControl("PriceTextBox"); TextBoxCountTextBox= (TextBox)e.Item.FindControl("CountTextBox");TextBoxAmountTextBox= (TextBox)e.Item.FindControl("AmountTextBox");

之后动态的给CountTextBox设置onblur事件:CountTextBox.Attributes["onblur"];让它等于一段字符串: CountTextBox.Attributes["onblur"] ="CountTextBoxBlur(this,'"+PriceTextBox.ClientID+"','"+AmountTextBox.ClientID+"')";一开始就是像上面这么写的,因为使用Repeater的时候就是这么实现一些功能的,可没想到程序执行存在问题,倒不是程序出现异常崩溃了,而是AmountTextBox文本框自动显示计算结果这个效果显示不出来,反反复复检查代码,也没发现问题,最后查看网页的源文件才发现,PriceTextBoxAmountTextBox渲染到客户端的ID分别是ListView1_PriceTextBoxListView1_AmountTextBox,而PriceTextBox.ClientIDAmountTextBox.ClientID却是ctrl3_PriceTextBoxctrl3_AmountTextBox,也就是说PriceTextBoxAmountTextBoxClientID属性在控件渲染到客户端的时候发生错误了,和控件在客户端实际的ID不相同,这样在jsCountTextBoxBlur函数中肯定取不到当前控件,也就不会出现想要的结果了。但我又把代码复制到VS08中执行一遍,发现并没有VS10中这样的现象,08PriceTextBoxAmountTextBoxClientID和控件在客户端实际的ID就是一样的。这就是Vs10中的Bug,准确说应该是在.Net4.0中使用ListView时会出现控件的ClientID属性值和控件在客户端实际的ID不相同这种Bug,而使用RepeaterGridView就不存在这样的Bug。至于ListView中控件的ClientID属性是以什么方式渲染到客户端的这就不知道了。

    我是这么解决的。

    PriceTextBox.ClientID的值为ctrl3_PriceTextBox,而PriceTextBox在客户端实际的IDListView1_PriceTextBox,把ctrl3_换成ListView1_问题就解决了,当然这是为了单纯的实现效果才这么写的,就把字符串改成"CountTextBoxBlur(this,'"+"ListView1_PriceTextBox" + "','"+"ListView1_AmountTextBox" + "')";就可以了。可这么写就需要去查看源文件中控件渲染的ID到底是什么,之后再回来写代码。其实还有一种方法,之所以寻找控件渲染到客户端的ID就是为了取到当前控件,之后进行Dom操作,那么可以把控件的ClientID属性值动态的设置给控件的一个新属性,对于当前控件,这个新属性就唯一标识控件了,可以取名ID1或者ID2,这都无所谓,之后在客户端脚本的CountTextBoxBlur函数中用jQuery对其进行操作就可以了,Dom应该不行了。

 

    希望其他同学在使用ListView控件时注意控件ClientID属性值和控件渲染到客户端的实际ID是不一样的这个小Bug。免得调试程序花掉太多时间。。。。很烦人。。。。烦人。。。。烦。。。。

posted on 2013-05-30 15:44  kobe746399  阅读(166)  评论(1编辑  收藏  举报