黑马程序员_.NET学习1(vs2010中用.net4.0的bug)

来源:互联网 发布:windows phone账号忘了 编辑:程序博客网 时间:2024/05/16 15:11

---------------------- Windows Phone 7手机开发.Net培训、.NET学习型技术博客、期待与您交流! ----------------------

 

                .net4.0 在ListView中新出现一个属性为ClientIDMode他又4个属性,1,Inherit   2,AutoID   3,Predctable  4,Static

         1,Inherit   采用的是树容器的策略。

         2,AutoID   采用的是.NEt3.5的策略。

         3,Static    指的是我给什么Id他就显示什么Id(vs编译时不做处理)

 

这些用法用在配合js代码在ListView的模版中找到控件的Id。

 

        vs2010中用.net4.0的bug例子:

 

if(e.Item.ItemType==ListViewItemType.InsertItem)
            {
                TextBox PriceTextBox = (TextBox)e.Item.FindControl("PriceTextBox");
                TextBox CountTextBox = (TextBox)e.Item.FindControl("CountTextBox");
                TextBox AMountTextBox = (TextBox)e.Item.FindControl("AMountTextBox");

                PriceTextBox.Attributes["onblur"] = "alert(document.getElementById('" + CountTextBox.ClientID + "').value)";

 

CountTextBox.ClientID 在客户端渲染出来的Id不是我们要找的id。这段代码放在3.5的框架执行就不会有问题,在4.0中他渲染到浏览器的代码为:

<inputname="ListView1$ctrl6$PriceTextBox"type="text"id="ListView1_ctrl6_PriceTextBox"onblur="alert(document.getElementById(&#39;ctrl6_CountTextBox&#39;).value)" />

</td>
<td>
<inputname="ListView1$ctrl6$CountTextBox"type="text"id="ListView1_ctrl6_CountTextBox" />
</td>
<td>
<inputname="ListView1$ctrl6$AMountTextBox"type="text"id="ListView1_ctrl6_AMountTextBox" />
 
很明显我们要的Id不对,他渲染的id为ctrl6_CountTextBox&#39;这个不用管,这是单引号(')只不过把他转义了),我们想要的是他帮我们找到动态生成的ListView1_ctrl6_CountTextBox(这个Id),而他找到的id却少了ListView1_这个前缀。    这是因为4.0框架的clientID生成顺序做了更改。
 
 
那么我们怎样解决这个问题呢?
 
1,我们可以在PriceTextBox.Attributes["onblur"] = "alert(document.getElementById('" + CountTextBox.ClientID + "').value)";这段代码中稍作修改把他改为PriceTextBox.Attributes["onblur"] = "alert(document.getElementById(’ListView1_'" + CountTextBox.ClientID + "').value)";
 
2,第二种方法:因为他在浏览器上渲染的id有问题,那么我们就给每个控件都添加一个额外的Id  取名myId;例:
 
                             PriceTextBox.Attributes["myId"] = PriceTextBox.ClientID;
                CountTextBox.Attributes["myId"] = CountTextBox.ClientID;
                AMountTextBox.Attributes["myId"] = AMountTextBox.ClientID;
 
 
 
在客户端用的时候我们可以通过JQuery选择器来取$("input[myId=" + PriceMyId + "]");
 
完整的例子;
 
 

protected void ListView1_ItemCreated(object sender, ListViewItemEventArgs e)//放到ItemDataBound里面更好
        {
            if (e.Item.ItemType == ListViewItemType.DataItem)
            {
                DataRowView rowView = (DataRowView)e.Item.DataItem;
                if (rowView != null)
                {
                    _25rkdgl.DAL2.DataSetInBill2.T_InBill2Row inBillRow = (_25rkdgl.DAL2.DataSetInBill2.T_InBill2Row)rowView.Row;

                    DropDownList DropDownList1 = (DropDownList)e.Item.FindControl("DropDownList1");
                    DropDownList1.SelectedValue = Convert.ToString(inBillRow.InType);
                }

            }
            if(e.Item.ItemType==ListViewItemType.InsertItem)
            {
                TextBox PriceTextBox = (TextBox)e.Item.FindControl("PriceTextBox");
                TextBox CountTextBox = (TextBox)e.Item.FindControl("CountTextBox");
                TextBox AMountTextBox = (TextBox)e.Item.FindControl("AMountTextBox");
                //第一种方法解决4.0向浏览器传id的bug
                PriceTextBox.Attributes["myId"] = PriceTextBox.ClientID;
                CountTextBox.Attributes["myId"] = CountTextBox.ClientID;
                AMountTextBox.Attributes["myId"] = AMountTextBox.ClientID;

                PriceTextBox.Attributes["onblur"] = "calcAMount('" + PriceTextBox.ClientID + "','" + CountTextBox.ClientID + "','" + AMountTextBox.ClientID + "')";
                CountTextBox.Attributes["onblur"] = "calcAMount('" + PriceTextBox.ClientID + "','" + CountTextBox.ClientID + "','" + AMountTextBox.ClientID + "')";
                //第二种方法解决4.0向浏览器传id的bug
                //PriceTextBox.Attributes["onblur"] = "alert(document.getElementById('ListView1_" + CountTextBox.ClientID + "').value)";
            }
        }

浏览器代码:

 

<script src="js/jquery-1.4.2.js" type="text/javascript"></script>
    <script type="text/javascript">
        function calcAMount(PriceMyId, CountMyId, AMountMyId) {
            var PriceVal = $("input[myId=" + PriceMyId + "]").val();
            var CountVal = $("input[myId=" + CountMyId + "]").val();

            var iPrice = parseInt(PriceVal,10);
            var iCount = parseInt(CountVal, 10);

            if (!isNaN(iPrice) && !isNaN(iCount))//isNan javaScript函数,用来判断一个值是否“不是数字”(Not a NumBer)
            {
                var AMountVal = $("input[myId=" + AMountMyId + "]").val(iPrice * CountVal);
            }
           
        }
    </script>

                                             

 

---------------------- Windows Phone 7手机开发.Net培训、.NET学习型技术博客、期待与您交流! ----------------------

 

 

详细请查看:http://net.itheima.com/