簡體   English   中英

Vb.net簡單文本框轉換為整數給出錯誤的輸入字符串格式不正確

[英]Vb.net Simple TextBox conversion to integer gives error input string was not in a correct format

我要驗證的表單上有一些文本框。 我想確認它們僅包含數字,並且“總計”文本框等於其他框的總和:

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等於其他框的總和。 因此,我有點困惑為什么會引發錯誤。 也許我在做從字符串到整數的轉換錯誤嗎?

有人知道這里發生了什么嗎?

我的問題與我的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時,您將無法在運行時訪問其任何屬性。 我注意到這可能不直觀。

我建議您在文本框中使用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

您正在嘗試將文本值轉換為整數,然后才能知道文本值是否為整數,請繼續閱讀

整數.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


......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM