Разрешить только десятичную точку после ввода трех цифр в текстовое поле в VB.NET? - PullRequest
0 голосов
/ 09 ноября 2011

Как разрешить только десятичную точку после ввода трех цифр в текстовое поле в VB.NET?

Допустим, я ввел «123», после этого я могу поставить только десятичную дробь, иначе он не допустит никакого другого ввода. Таким образом, результат будет «123».

    Dim KeyAscii As Integer
    KeyAscii = Asc(myE.KeyChar)

    Select Case KeyAscii
        Case Asc("0") To Asc("9"), Asc(ControlChars.Back)

            myE.Handled = False
        Case Asc(".")

            If InStr(myTextbox.Text, ".") = 0 Then
                myE.Handled = False
            Else : myE.Handled = True
            End If

        Case myE.KeyChar = Chr(127)
            myE.Handled = False
        Case Else
            myE.Handled = True
    End Select

Ответы [ 3 ]

1 голос
/ 09 ноября 2011

Попробуйте:

Select Case myE.KeyChar
    Case "0"c To "9"c, "."c
        myE.Handled = InStr(myTextbox.Text, ".") > 0
    Case ControlChars.Back, Convert.ToChar(127)
        myE.Handled = False
    Case Else
        myE.Handled = True
End Select

Примечание. Нет смысла преобразовывать KeyChar в Integer, а затем использовать Asc () для сравнения.

EDIT : Согласно вашему комментарию, после третьей цифры должна быть поставлена ​​десятичная точка, после которой могут следовать еще 2 или 3 цифры.

Select Case myE.KeyChar
    Case "0"c To "9"c
        myE.Handled = myTextbox.Text.Length = 3 OrElse myTextbox.Text.Length >= 7
    Case "."c
        myE.Handled = myTextbox.Text.Length <> 3
    Case ControlChars.Back, Convert.ToChar(127)
        myE.Handled = False
    Case Else
        myE.Handled = True
End Select
1 голос
/ 09 ноября 2011

В WinForms вы можете сделать это, используя TextChanged-Event для Textbox и RegularExpressions:

Пример:

Imports System.Text.RegularExpressions



Public Class Form1

   Private Sub TextBox1_TextChanged(sender As System.Object, e As System.EventArgs) Handles TextBox1.TextChanged
      '** Regex Pattern
      Dim pattern As String = "^(([0-9]{1,3})|([0-9]{1,3}(\.){1,1}([0-9]){0,3}))$"
      '** Copy of the Textbox Content
      Dim strText As String = TextBox1.Text
      '** Remove chars at the end of the string until the Textbox is empty or the contained chars are valid
      While Not Regex.IsMatch(strText, pattern) AndAlso Not strText = ""
         strText = strText.Substring(0, strText.Length - 1)
      End While
      '** Set the new text
      TextBox1.Text = strText
      '** Set the caret to the end of the string in the textbox
      TextBox1.Select(TextBox1.Text.Length, 0)
   End Sub
End Class

Этот пример позволяет написать 123, 345., 12., 123.1, 123.123 и т. Д. *

Чтобы улучшить количество цифр до или после десятичной запятой, вы можете отредактировать {0,3} в шаблоне (первые 2 раза для цифр до десятичной запятой и третий раз для цифр после десятичной) Просто установите вместо 3 желаемое количество цифр (или замените его на * или {0,} для неограниченного числа)

Надеюсь, это поможет.

РЕДАКТИРОВАТЬ 1:

  • Изменен шаблон с "^[0-9]{0,3}(\.){0,1}$" на "^(([0-9]{1,3})|([0-9]{1,3}(\.){1,1}([0-9]){0,3}))$", чтобы разрешить ввод цифр после десятичной дроби
  • Исправлено условие цикла Loop с Textbox1.Text = "" до strText = ""
0 голосов
/ 10 ноября 2011

Попробуйте это:

Private Sub TextBox1_TextChanged (отправитель ByVal как System.Object, ByVal e как System.EventArgs) Обрабатывает TextBox1.TextChanged Dim wherePointIs As Integer = TextBox1.Text.IndexOf (".") Если wherePointIs <> 3 Тогда «Что должно произойти End If End Sub

Это будет только проверять, есть ли точка в точке три. Вы можете изменить его, чтобы он проверял, есть ли ОДНА десятичная точка и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...