您的位置:首页 > 职场人生

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

2012-06-24 00:48 323 查看
---------------------- 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('ctrl6_CountTextBox').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('这个不用管,这是单引号(')只不过把他转义了),我们想要的是他帮我们找到动态生成的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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: