Rubrik: Controls · TextBox & RichTextBox | VB-Versionen: VB2005, VB2008 | 07.08.09 |
NumericTextBox Control Eine von der Standard TextBox abgeleitete Klasse, die nur numerische Eingaben erlaubt. | ||
Autor: Christoph Tillmann | Bewertung: | Views: 13.955 |
christophsblog.spaces.live.com | System: Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Neulich bin ich über ein recht skurriles C# Snippet gestolpert, welches nur numerische Eingaben in eine TextBox erlaubt. Da ich gerade nichts Besseres zu tun hatte, habe ich „meine“ (sie kommt natürlich hier aus dem Forum) alte Lösung hervorgekramt und etwas an ihr herumgeschraubt. Was dabei rumgekommen ist, möchte ich euch hier vorstellen.
Ich habe eine Klasse „NumericTextBox“ erstellt, diese erbt von der TextBox.
Die Klasse „NumericTextBox“ wird nach dem Builden in der ToolBox vom Visual Studio bereitgestellt, mit allen Membern der TextBox.
Der Klasse NumericTextBox habe ich die Eigenschaft IsInteger zugefügt:
- IsInteger = True (nur Ganzzahlen sind erlaubt, Integer)
- IsInteger = False (Die Eingabe von Dezimaltrennzeichen ist möglich, Float)
Die Eigenschaft wird im PropertyGrid der NumericTextBox unter der Kategorie „Numeric” geführt.
Über das KeyDown Event werden nur die gültigen KeyChars zugelassen, der Rest wird unterdrückt. Das war schon alles. Ich denke der Rest ist selbsterklärend, wenn man die Klasse mal in Ruhe anschaut.
Hier der Code:
Imports System.ComponentModel Public Class NumericTextBox Inherits TextBox Private _switch As Boolean = False
Protected Overrides Sub OnKeyPress( _ ByVal e As System.Windows.Forms.KeyPressEventArgs) MyBase.OnKeyPress(e) Select Case Asc(e.KeyChar) ' Zahlen und Backspace Case 48 To 57, 8 Case 44 ' Dezimaltrennzeichen zulassen bzw. unterdrücken If IsInteger Then e.Handled = True Else If Me.Text.Contains(",") Then e.Handled = True End If Case Else e.Handled = True End Select End Sub
<Description("Legt fest ob die TextBox nur Ganzzahlen annimmt. " & _ "True = Integer, False = Float"), Category("Numeric")> _ Public Property IsInteger() As Boolean Get Return _switch End Get Set(ByVal value As Boolean) _switch = value End Set End Property
End Class
Optimierungspotenzial ist noch vorhanden, da es nichtmöglich ist Vorzeichen einzugeben, was ja u.U. notwendig sein könnte.
Viel Spaß bei der kreativen Weiterverwendung!