黑马程序员_.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/
----------------------
.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/
相关文章推荐
- .Net 4.0、C# 2010、VB 2010、VC 2010、VS2010最新学习资料下载
- 黑马程序员.net学习笔记一 索引小记
- 黑马程序员 .NET学习笔记 <10>
- 黑马程序员之VS2010学习笔记:VS2010MSDN安装图解
- VS2010 .NET 4学习资料整理
- 黑马程序员<.net学习---进程与线程>
- 黑马程序员_.NET学习13(SQLServer复习)
- 黑马程序员 .NET学习笔记 <2>
- 黑马程序员 .NET学习笔记 <6>
- 黑马程序员_.NET学习15(回看总结JQuery)
- 黑马程序员_.NET学习2(前台基础)
- 黑马程序员 .NET学习笔记 <8>
- 黑马程序员_.NET学习5(前台)
- 黑马程序员 .NET学习笔记 <4>
- 黑马程序员 .NET学习笔记 <7>
- .NET深入学习之---一个不是Bug的Bug
- 开始学习黑马程序员.net.大家加油
- 黑马程序员 .NET学习笔记 <1>
- 黑马程序员<.net学习---Socket套接字>
- 黑马程序员 .NET学习笔记 <3>