积极答复者
一个奇怪的 ajax 里的 类型转换问题

问题
-
有这样一个页面程序
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title></title>
</head>
<script runat="server" language="C#">
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
System.Data.DataTable dt = new System.Data.DataTable("Product");dt.Columns.Add(new System.Data.DataColumn("PID"));
dt.Columns.Add(new System.Data.DataColumn("PName"));
dt.Columns.Add(new System.Data.DataColumn("PPrice"));System.Data.DataRow dr;
for (int i = 0; i < 5; i++)
{
dr = dt.NewRow();
dr["PID"] = i;
dr["PName"] = i;
dr["PPrice"] = i;dt.Rows.Add(dr);
}dlTest.DataSource = dt;
dlTest.DataBind();
}
}protected void TextBox1_TextChanged(object sender, EventArgs e)
{
for (int i = 0; i < dlTest.Items.Count; i++)
{
TextBox tb = (TextBox)dlTest.Items[i].FindControl("txtPrice");double price = Convert.ToDouble(TextBox1.Text);
tb.Text = price.ToString();
}
}
</script>
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="TextBox1" runat="server" ontextchanged="TextBox1_TextChanged"
AutoPostBack="True"></asp:TextBox>
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:DataList ID="dlTest" runat="server" RepeatColumns="6" RepeatDirection="Horizontal" Width="95%">
<ItemTemplate>
<table width="100%">
<tr>
<td align="center"><table width="100%">
<tr><td align="center"><asp:Label ID="labPID" runat="server" Text='<%#Eval("PID") %>' Visible = "false"></asp:Label>
<asp:Label ID="labPName" runat="server" Text='<%#Eval("PName") %>'></asp:Label>
</td></tr>
<tr>
<td align="center"><asp:Label ID="labPriceYY" runat="server" Text='<%#Eval("PPrice") %>' Visible = "false"></asp:Label>
Price: <asp:TextBox ID="txtPrice" runat="server" Width="50" Text='<%#Eval("PPrice") %>'></asp:TextBox> €
</td>
</tr>
<tr><td></td></tr>
</table>
</td>
</tr>
</table>
</ItemTemplate>
<AlternatingItemStyle BackColor="#F7F7F7" />
<ItemStyle BackColor="#E7E7FF" ForeColor="#4A3C8C" VerticalAlign="Bottom" Height="100%"/>
<SelectedItemStyle BackColor="#738A9C" ForeColor="#F7F7F7" Font-Bold="True" />
<HeaderStyle BackColor="#4A3C8C" Font-Bold="True" ForeColor="#F7F7F7" />
</asp:DataList>
</ContentTemplate>
</asp:UpdatePanel>
</div>
</form>
</body>
</html>
使用的是 Windows server 2008
当使用 Version Information: Microsoft .NET Framework Version:2.0.50727.3053; ASP.NET Version:2.0.50727.3053 时
double price = Convert.ToDouble(TextBox1.Text);
这句是正常的。
但当使用 版本信息: Microsoft .NET Framework 版本:2.0.50727.3074; ASP.NET 版本:2.0.50727.3074
时 , 当 TextBox1.Text 的内容为 int 时是正确, 而内容为小数时就出错
堆栈跟踪:
[FormatException: 输入字符串的格式不正确。] System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal) +7469351 System.Number.ParseDecimal(String value, NumberStyles options, NumberFormatInfo numfmt) +146 System.Convert.ToDecimal(String value) +83
或者怎么能把版本: Microsoft .NET Framework 版本:2.0.50727.3074; ASP.NET 版本:2.0.50727.3074
降到
Version Information: Microsoft .NET Framework Version:2.0.50727.3053; ASP.NET Version:2.0.50727.3053
谢谢了- 已移动 肖小勇Moderator 2009年7月9日 1:07 (发件人:Visual C#)
答案
-
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="X200907090918.aspx.cs" Inherits="HTML_CSS_JAVASCRIPT_X200907090918" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head id="Head1" runat="server"> <title></title> </head> <script runat="server" language="C#"> protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { System.Data.DataTable dt = new System.Data.DataTable("Product"); dt.Columns.Add(new System.Data.DataColumn("PID")); dt.Columns.Add(new System.Data.DataColumn("PName")); dt.Columns.Add(new System.Data.DataColumn("PPrice")); System.Data.DataRow dr; for (int i = 0; i < 5; i++) { dr = dt.NewRow(); dr["PID"] = i; dr["PName"] = i; dr["PPrice"] = i; dt.Rows.Add(dr); } dlTest.DataSource = dt; dlTest.DataBind(); } } protected void TextBox1_TextChanged(object sender, EventArgs e) { for (int i = 0; i < dlTest.Items.Count; i++) { TextBox tb = (TextBox)dlTest.Items[i].FindControl("txtPrice"); double price = Convert.ToDouble(TextBox1.Text); tb.Text = price.ToString(); } } </script> <body> <form id="form2" runat="server"> <div> <asp:TextBox ID="TextBox1" runat="server" onkeypress="AllowInputNumber();" ontextchanged="TextBox1_TextChanged" AutoPostBack="True"></asp:TextBox> <script type="text/javascript"> // 限制用户只能输入数字 function AllowInputNumber(){ if(!(((window.event.keyCode >= 48) && (window.event.keyCode <= 57)) || (window.event.keyCode == 13) || (window.event.keyCode == 46) || (window.event.keyCode == 45))){ window.event.keyCode = 0; } } </script> <asp:ScriptManager ID="ScriptManager1" runat="server"> </asp:ScriptManager> <asp:UpdatePanel ID="UpdatePanel1" runat="server"> <ContentTemplate> <asp:DataList ID="dlTest" runat="server" RepeatColumns="6" RepeatDirection="Horizontal" Width="95%"> <ItemTemplate> <table width="100%"> <tr> <td align="center"><table width="100%"> <tr><td align="center"><asp:Label ID="labPID" runat="server" Text='<%#Eval("PID") %>' Visible = "false"></asp:Label> <asp:Label ID="labPName" runat="server" Text='<%#Eval("PName") %>'></asp:Label> </td></tr> <tr> <td align="center"><asp:Label ID="labPriceYY" runat="server" Text='<%#Eval("PPrice") %>' Visible = "false"></asp:Label> Price: <asp:TextBox ID="txtPrice" runat="server" Width="50" Text='<%#Eval("PPrice") %>'></asp:TextBox> € </td> </tr> <tr><td></td></tr> </table> </td> </tr> </table> </ItemTemplate> <AlternatingItemStyle BackColor="#F7F7F7" /> <ItemStyle BackColor="#E7E7FF" ForeColor="#4A3C8C" VerticalAlign="Bottom" Height="100%"/> <SelectedItemStyle BackColor="#738A9C" ForeColor="#F7F7F7" Font-Bold="True" /> <HeaderStyle BackColor="#4A3C8C" Font-Bold="True" ForeColor="#F7F7F7" /> </asp:DataList> </ContentTemplate> </asp:UpdatePanel> </div> </form> </body> </html>
知识改变命运,奋斗成就人生!- 已标记为答案 KeFang Chen 2009年7月10日 1:52
-
还可以对其进行异常捕获,然后提示用户....
protected void TextBox1_TextChanged(object sender, EventArgs e)
{
for (int i = 0; i < dlTest.Items.Count; i++)
{
TextBox tb = (TextBox)dlTest.Items[i].FindControl("txtPrice");
try
{
double price = Convert.ToDouble(TextBox1.Text);
tb.Text = price.ToString();
}
catch
{
ScriptManager.RegisterStartupScript(this.Page, this.Page.GetType(), "alert", "alert('您输入了非法字符!')", true);
}
}
}- 已标记为答案 KeFang Chen 2009年7月10日 1:52
全部回复
-
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="X200907090918.aspx.cs" Inherits="HTML_CSS_JAVASCRIPT_X200907090918" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head id="Head1" runat="server"> <title></title> </head> <script runat="server" language="C#"> protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { System.Data.DataTable dt = new System.Data.DataTable("Product"); dt.Columns.Add(new System.Data.DataColumn("PID")); dt.Columns.Add(new System.Data.DataColumn("PName")); dt.Columns.Add(new System.Data.DataColumn("PPrice")); System.Data.DataRow dr; for (int i = 0; i < 5; i++) { dr = dt.NewRow(); dr["PID"] = i; dr["PName"] = i; dr["PPrice"] = i; dt.Rows.Add(dr); } dlTest.DataSource = dt; dlTest.DataBind(); } } protected void TextBox1_TextChanged(object sender, EventArgs e) { for (int i = 0; i < dlTest.Items.Count; i++) { TextBox tb = (TextBox)dlTest.Items[i].FindControl("txtPrice"); double price = Convert.ToDouble(TextBox1.Text); tb.Text = price.ToString(); } } </script> <body> <form id="form2" runat="server"> <div> <asp:TextBox ID="TextBox1" runat="server" onkeypress="AllowInputNumber();" ontextchanged="TextBox1_TextChanged" AutoPostBack="True"></asp:TextBox> <script type="text/javascript"> // 限制用户只能输入数字 function AllowInputNumber(){ if(!(((window.event.keyCode >= 48) && (window.event.keyCode <= 57)) || (window.event.keyCode == 13) || (window.event.keyCode == 46) || (window.event.keyCode == 45))){ window.event.keyCode = 0; } } </script> <asp:ScriptManager ID="ScriptManager1" runat="server"> </asp:ScriptManager> <asp:UpdatePanel ID="UpdatePanel1" runat="server"> <ContentTemplate> <asp:DataList ID="dlTest" runat="server" RepeatColumns="6" RepeatDirection="Horizontal" Width="95%"> <ItemTemplate> <table width="100%"> <tr> <td align="center"><table width="100%"> <tr><td align="center"><asp:Label ID="labPID" runat="server" Text='<%#Eval("PID") %>' Visible = "false"></asp:Label> <asp:Label ID="labPName" runat="server" Text='<%#Eval("PName") %>'></asp:Label> </td></tr> <tr> <td align="center"><asp:Label ID="labPriceYY" runat="server" Text='<%#Eval("PPrice") %>' Visible = "false"></asp:Label> Price: <asp:TextBox ID="txtPrice" runat="server" Width="50" Text='<%#Eval("PPrice") %>'></asp:TextBox> € </td> </tr> <tr><td></td></tr> </table> </td> </tr> </table> </ItemTemplate> <AlternatingItemStyle BackColor="#F7F7F7" /> <ItemStyle BackColor="#E7E7FF" ForeColor="#4A3C8C" VerticalAlign="Bottom" Height="100%"/> <SelectedItemStyle BackColor="#738A9C" ForeColor="#F7F7F7" Font-Bold="True" /> <HeaderStyle BackColor="#4A3C8C" Font-Bold="True" ForeColor="#F7F7F7" /> </asp:DataList> </ContentTemplate> </asp:UpdatePanel> </div> </form> </body> </html>
知识改变命运,奋斗成就人生!- 已标记为答案 KeFang Chen 2009年7月10日 1:52
-
还可以对其进行异常捕获,然后提示用户....
protected void TextBox1_TextChanged(object sender, EventArgs e)
{
for (int i = 0; i < dlTest.Items.Count; i++)
{
TextBox tb = (TextBox)dlTest.Items[i].FindControl("txtPrice");
try
{
double price = Convert.ToDouble(TextBox1.Text);
tb.Text = price.ToString();
}
catch
{
ScriptManager.RegisterStartupScript(this.Page, this.Page.GetType(), "alert", "alert('您输入了非法字符!')", true);
}
}
}- 已标记为答案 KeFang Chen 2009年7月10日 1:52
-
不好意思, 昨天回学校有事所以就没上网 :)
我加了那个 AllowInputNumber() 的判断, 还是同样的错误
我用的是 Windows 2008 ,
.NET 的版本信息是 Microsoft .NET Framework 版本:2.0.50727.3074; ASP.NET 版本:2.0.50727.3074
我在另一台机器 安装 Windows 2008, 使用
Version Information: Microsoft .NET Framework Version:2.0.50727.3053; ASP.NET Version:2.0.50727.3053
结果就是正常的。 -
我在本机用的 XP, 使用 Microsoft .NET Framework Version:2.0.50727.3053; ASP.NET Version:2.0.50727.3053 也是正常的。
工作用是 Windows 2008 ,
.NET 的版本信息是 Microsoft .NET Framework 版本:2.0.50727.3074; ASP.NET 版本:2.0.50727.3074
就出错,
我在另一台机器 安装 Windows 2008, 使用
Version Information: Microsoft .NET Framework Version:2.0.50727.3053; ASP.NET Version:2.0.50727.3053
结果就是正常的。
公司的网管把自动升级开着, 也不知道是那个补丁把 3053 升到了 3074 , 如果能把那个补丁卸掉也是一种解决办法。
谢谢了