簡體   English   中英

VB.NET 和 Windows Forms 中的文本框驗證

[英]TextBox Validation in VB.NET and Windows Forms

我正在使用以下代碼來驗證用戶輸入的文本。 它工作得很好。 但我想添加退格功能,以便用戶刪除錯誤輸入的號碼。

我已經嘗試了幾件事,但它們在最后一個數字之前(小數點之后)起作用了,即它不允許在完全輸入數字后刪除。 數字輸入格式為:12313213.45

我該怎么辦?

Private Sub TextBox5_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox5.KeyPress

    'validation '
    Dim KeyAscii As Short = Asc(e.KeyChar)
    If Not ((KeyAscii >= System.Windows.Forms.Keys.D0 And KeyAscii <= System.Windows.Forms.Keys.D9) Or (KeyAscii = System.Windows.Forms.Keys.Back) Or Chr(KeyAscii) = "." Or (Chr(KeyAscii) Like "[ ]")) Then
        KeyAscii = 0
        TextBox5.Focus()
    End If
    If KeyAscii = 0 Then
        e.Handled = True
    End If

    If TextBox5.Text.IndexOf(".") >= 0 And e.KeyChar = "." Then
        e.Handled = True
    End If

    If TextBox5.Text.IndexOf(".") > 0 Then
        If TextBox5.SelectionStart > TextBox5.Text.IndexOf(".") Then
            If TextBox5.Text.Length - TextBox5.Text.IndexOf(".") = 3 Then
                e.Handled = True
            End If
        End If
    End If
End Sub

有一種更簡單的方法來驗證這一點。 嘗試將編輯框中的文本轉換為浮點數。 如果捕獲異常,則該數字無效。

試圖通過擊鍵來驗證擊鍵會讓你很頭疼。

更好的方法是使用支持小數的控件(如果您使用的是基礎設施、componentone、devexpress 等)。用戶可以獲得視覺提示,並且可以做一些簡潔的事情,例如單擊箭頭以推進數字。

如果您使用的是普通的舊 winform,請查看蒙版編輯控件。

就我個人而言,當應用程序試圖糾正我並且我還沒有完成輸入數據時,我發現它非常令人惱火 讓用戶完成然后在有任何問題時通知他們會更加用戶友好。

txtMobil.Text = Format(txtMobil.Text, "###-###-####")

或者對困難的東西使用正則表達式

是的,或者只是使嵌套的 if...then 塊看起來像這樣:

If Textbox5.Text.IndexOf(".") > 0 Then
    If Textbox5.SelectionStart > Textbox5.Text.IndexOf(".") Then
        If Textbox5.Text.Length - Textbox5.Text.IndexOf(".") = 3 Then
            If KeyAscii <> System.Windows.Forms.Keys.Back Then e.Handled = True
        End If
    End If
End If

不要嘗試一次驗證一個擊鍵。
1) 您剛剛發現退格需要更多代碼,現在添加對剪切/復制和粘貼的支持,並且刪除鍵和鍵入替換選擇。 代碼不是很好。
2)它只會讓用戶感到困惑。 或者更糟的是,他們嘗試輸入 a。 將日期分隔到您的字段中,您可以通過忽略第二個來將該日期強制轉換為合法數字。 他們現在輸入了一些完全錯誤的東西,你的程序不會告訴他們。
文本框的驗證事件是這種邏輯應該 go 的地方。 它會在焦點移動到另一個控件時觸發(其 CausesValidation 屬性為 true,這允許即使當前控件未處於有效狀態也可以單擊取消按鈕)。
在驗證事件中,您可以進行所有需要的檢查,如果數據無效則取消該事件,以及顯示您需要的任何消息。 為了驗證我建議從 Single.TryParse 開始的值,如果轉換成功,您可以繼續進行所需的任何范圍檢查。 TryParse 比@Bork 的建議更好,因為它更易於閱讀並避免拋出/捕獲不必要的異常。

編輯:剛剛注意到您還限制了輸入文本的長度。 您可以通過設置 TextBox 的 MaxLength 屬性來做到這一點。

我認為下面的鏈接應該給你你所追求的東西:

數字文本框

雖然它需要大量的代碼來處理每次按鍵的驗證,但這當然是可能的,並且上面的代碼似乎處理了刪除、退格、復制/粘貼等。

暫無
暫無

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

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