Vb.net简单TextBox转换为整数,错误输入字符串格式不正确

时间:2014-06-09 16:31:32

标签: asp.net .net vb.net

我想要验证的表单上有一些文本框。我想确认它们只包含数字,并且“total”文本框等于其他框的总和:

Protected Sub TotalBoxValidator_ServerValidate(source As Object, args As System.Web.UI.WebControls.ServerValidateEventArgs) Handles TotalBoxValidator.ServerValidate
    If ((Convert.ToInt32(Box1.Text) + Convert.ToInt32(Box2.Text) + Convert.ToInt32(Box3.Text) + Convert.ToInt32(Box4.Text) + Convert.ToInt32(Box5.Text) + Convert.ToInt32(Box6.Text) + Convert.ToInt32(Box7.Text)) = Convert.ToInt32(TotalBox.Text)) Then
        args.IsValid = True
    Else
        args.IsValid = False
    End If
End Sub

现在在测试期间,我只用整数填充框。总框会自动更新为其他框的总和。但是,当我单击表单上的“提交”按钮,并且所有验证程序都运行时,此程序无法正常运行。

代码在第一个if语句上抛出一个错误,表示Convert.ToInt32调用的输入无效。 “输入字符串的格式不正确”。我很肯定我将整数放在每个框中,并且我的TotalBox等于其他框的总和。所以我有点坚持为什么这会引发错误。 也许我正在从字符串转换为整数错误?

有谁知道这里发生了什么?

3 个答案:

答案 0 :(得分:2)

我的问题与我的TotalBox(一个ASP.net TextBox控件)将其“Enabled”属性设置为false这一事实有关。我这样做是因为它使文本框变灰,用户无法更改文本框的值。由于TextBox未启用,因此无法在运行时访问TextBox的值。虽然我在页面的javascript中成功地更改了它的值,但是在视觉上文本框的值在页面上更新,尝试在后面的代码中使用它的值作为字符串导致错误。

它与代码的逻辑或任何语法错误无关。要解决此问题,我将TotalBox的Enabled属性设置为true。现在盒子不再灰显了,用户可以将它们的总数改为不同于盒子的总和,这不是我想要的,但是我再次在这里验证总数,所以它不是很重要。我会回去试着用javascript中的文本框变灰,因为我觉得这样可以保持获取TextBoxes值的能力,同时仍然让它变灰。

编辑:上述解决方案确实有效。对于遇到此问题的其他人,请考虑尝试使用javascript而不是任何.net或asp代码来淡化文本框。

以下是更新后的代码:

Protected Sub TotalBoxValidator_ServerValidate(source As Object, args As System.Web.UI.WebControls.ServerValidateEventArgs) Handles TotalBoxValidator.ServerValidate
        Dim Box1Value = Convert.ToInt32(Box1.Text)
        Dim Box2Value = Convert.ToInt32(Box2.Text)
        Dim Box3Value = Convert.ToInt32(Box3.Text)
        Dim Box4Value = Convert.ToInt32(Box4.Text)
        Dim Box5Value = Convert.ToInt32(Box5.Text)
        Dim Box6Value = Convert.ToInt32(Box6.Text)
        Dim Box7Value = Convert.ToInt32(Box7.Text)
        Dim TotalBoxValue = Convert.ToInt32(TotalBox.Text)
        If (Box1Value + Box2Value + Box3Value + Box4Value + Box5Value + Box6Value + Box7Value = TotalBoxValue) Then
            args.IsValid = True
        Else
            args.IsValid = False
        End If
    End Sub

现在,这是调试这种情况真正有用的东西。尝试将转换放在不同的行上,因为当程序停止时,它会准确显示哪个转换出错了。就我而言,我在TotalBoxValue行上出错了。所以我知道我的TotalBox出了问题。 TotalBox与其他任何文本框的不同之处是什么?嗯,首先,这是总数。但我知道这是正常的。那么我想到了它的属性。它的enabled属性设置为false,与其他框不同。所以我知道这必须改变。

由于某些原因,在asp.net中,当控件的Enabled属性设置为false时,您无法在运行时访问其任何属性。我注意到这可能不直观。

答案 1 :(得分:1)

我建议您在文本框中使用CompareValidators

如果您的值不合适,这将确保页面甚至不会回发。示例标记:

<asp:CompareValidator ErrorMessage="errormessage" ControlToValidate="Box1" 
runat="server" Type="Integer" />

然后你可以在技术上保留你已经发布的代码,但是如果你想放弃验证器这样的东西会将无效输入视为0:

Dim temp As Integer
Dim boxTotal = {box1.Text, _
                box2.Text, _
                box3.Text, _
                box4.Text, _
                box5.Text, _
                box6.Text, _
                box7.Text} _
              .Select(Function(text) If(Integer.TryParse(text, temp), temp, 0)) _
              .Sum()
Integer.TryParse(TotalBox.Text, temp)
args.IsValid = boxTotal = temp

答案 2 :(得分:0)

您正在尝试在知道文本值是否为整数之前将文本值转换为整数,请阅读

integer.TryParse

dim v1, v2, v3, v4, v5, v6, v7 as integer

if not integer.tryparse(box1.text, v1) then
     args.IsValid = False
     return
endif

if not integer.tryparse(box2.text, v2) then
     args.IsValid = False
     return
endif


......