Существует несколько способов приблизиться к этому. Сначала нужно использовать элемент управления NumericUpDown или пользовательский TextBox, который принимает только числовой ввод, как показано ниже, в котором также учитываются данные, вставленные из буфера обмена Windows. Добавьте класс в свой проект, создайте в верхней части панели инструментов IDE, щелкните по настраиваемому текстовому полю, чтобы добавить его в свою форму и просто использовать его.
Public Class numericTextbox
Inherits TextBox
Const WM_PASTE As Integer = &H302
Protected Overrides Sub OnKeyPress(ByVal e As System.Windows.Forms.KeyPressEventArgs)
Dim Value As String = Me.Text
Value = Value.Remove(Me.SelectionStart, Me.SelectionLength)
Value = Value.Insert(Me.SelectionStart, e.KeyChar)
e.Handled = CBool(Value.LastIndexOf("-") > 0) _
Or Not (Char.IsControl(e.KeyChar) OrElse _
Char.IsDigit(e.KeyChar) OrElse _
(e.KeyChar = "."c And Not Me.Text.Contains(".") Or _
e.KeyChar = "."c And _
Me.SelectedText.Contains(".")) OrElse (e.KeyChar = "-"c And Me.SelectionStart = 0))
MyBase.OnKeyPress(e)
End Sub
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
If m.Msg = WM_PASTE Then
Dim Value As String = Me.Text
Value = Value.Remove(Me.SelectionStart, Me.SelectionLength)
Value = Value.Insert(Me.SelectionStart, Clipboard.GetText)
Dim result As Decimal = 0
If Not Decimal.TryParse(Value, result) Then
Return
End If
End If
MyBase.WndProc(m)
End Sub
End Class
Другая идея, зависящая от целевой среды 3.5 и выше, заключается в использовании методов расширения.
Public Module LanguageExtensions
''' <summary>
''' Check if Text property of a TextBox is numeric
''' </summary>
''' <param name="sender"></param>
''' <returns></returns>
''' <remarks></remarks>
<System.Diagnostics.DebuggerStepThrough()> _
<System.Runtime.CompilerServices.Extension()> _
Public Function IsNumeric(ByVal sender As TextBox) As Boolean
Return Integer.TryParse(sender.Text, Nothing) OrElse Double.TryParse(sender.Text, Nothing)
End Function
''' <summary>
''' Check if Text Property of a TextBox is a decimal with formatting or not
''' </summary>
''' <param name="sender"></param>
''' <returns></returns>
''' <remarks></remarks>
<System.Diagnostics.DebuggerStepThrough()> _
<System.Runtime.CompilerServices.Extension()> _
Public Function IsNumericWithCurrency(ByVal sender As TextBox) As Boolean
Return Decimal.TryParse(sender.Text, Globalization.NumberStyles.Currency, Nothing, Nothing)
End Function
End Module
Пример методов расширения
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
If TextBox1.IsNumericWithCurrency Then
MessageBox.Show("Yes")
Else
MessageBox.Show("No")
End If
End Sub
End Class
Если ни один из них не удовлетворить ваши потребности, я бы с предложением Фабио.
'IsNumeric (textBox.Text)' он использует свойство Text, а не текстовое поле. – OneFineDay