Manchmal möchte man dem Benutzer nicht erlauben, bestimmte Zeichenfolgen im Textfeld einer Textbox, einer MaskTextbox, einer Combobox oder einer RichTextbox einzugeben. Im KeyPress-Ereignis dieser Controls kann man in diesem Fall
Damit lässt sich prüfen, ob dieser Text die jeweils gültige Zensur-Routine (im Beispiel: "OutOfRule") passieren darf, oder ob das eingegebene Zeichen abgewiesen werden muss. Um das Keypress-Ereignis für alle Controls in einer Routine zu verarbeiten, habe ich zur Abfrage der benötigten Control-Properties in den Eventhandlern "System.Reflections" verwendet (Routine: "GetControlProperties"). Zusätzlich zur Zeicheneingabe sollte man prüfen, ob unerwünschte Zeichenfolgen durch das Löschen von Zeichen entstehen würden. Dafür ist das KeyDown-Ereignis zuständig, weil es auch die Betätigung von Sonderzeichen meldet (Routine: "KeyIsDown"). Im Beispiel werden das Löschen eines Zeichens durch die "Back"- bzw. "Delete"-Taste und das Löschen markierter Zeichen durch die "Delete"-Taste verhindert, falls der verkürzte Text "OutOfRule" sein würde. Die Buchstabenfolgen "abc" und "xyz" werden in den Textfeldern der drei Controls nicht akzeptiert. Diese Regel ist Case-Sensitive programmiert, d.h. die Zeichenfolgen "ABC" oder "Xyz" sind erlaubt. Um das Beispiel auszuführen, erstellen Sie eine neue Windows-Application namens "frmInputTextFilter" und fügen Sie den Code in das Startformular ein. Geben Sie nach dem Start in einem der Textfelder die Zeichenfolge "abdefg" ein und versuchen Sie dann, hinter dem "b" noch ein "c" einzufügen. Sie werden scheitern! An anderen Positionen im Textfeld dürfen Sie das "c" natürlich eintragen. Die Entstehung unerlaubter Zeichenfolgen, die per "DragDrop", DropDown-Liste oder über das Kontextmenü des Controls erzeugt werden, ist ggf. noch zusätzlich zu unterbinden. Als (einfachere) Alternative kann man im KeyDown-Ereignis den noch unveränderten Text und die Cursorposition speichern. Im KeyUp-Ereignis steht der bereits aktualisierte Text in der Steuerelement-Property zur Verfügung und kann überprüft werden. Entspricht er nicht den Regeln, setzt man die Steuerelement-Eigenschaften einfach auf die zwischen-gespeicherten Werte zurück.
Option Strict On Option Explicit On Option Infer Off Imports System.Windows.Forms Public Class frmInputTextFilter ' Sechs Text-Controls erstellen ' erforderliche Eigenschaften: Text, SelectionStart, SelectionLength Dim WithEvents myTextBox As New TextBox Dim WithEvents myMaskBox As New MaskedTextBox Dim WithEvents myComboBox As New ComboBox Dim WithEvents myRTFBox As New RichTextBox Dim WithEvents myToolTextBox As New ToolStripTextBox Dim WithEvents myToolComboBox As New ToolStripComboBox Dim WithEvents myContextMenu As New ContextMenu Dim WithEvents myTools As New ToolStrip Private Sub frmTextBoxFilter_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load ' Formular einrichten und Text-Controls platzieren With Me .Width = 300 : .Height = 320 .StartPosition = System.Windows.Forms.FormStartPosition.WindowsDefaultLocation .FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle End With With myTextBox .Top = 10 : .Height = 80 : .Multiline = True : .AllowDrop = False End With With myComboBox .Top = 100 : .Items.Add("abc") : .Items.Add("xyz") .DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDown End With With myRTFBox .Top = 130 : .Height = 80 : .Multiline = True : .AllowDrop = False End With myMaskBox.Top = 230 : myMaskBox.ContextMenu = myContextMenu ' Optionaler Menü-Ersatz (kann entfallen) myContextMenu.MenuItems.Add("Nix da!") With myTools .Dock = DockStyle.Bottom : .Stretch = True ' ToolStrip-Controls hinzufügen .Items.Add(myToolTextBox) .Items.Add(myToolComboBox) End With myToolComboBox.Items.Add("abc") MyToolComboBox.Items.Add("xyz") ' Alle Controls der Form hinzufügen With Me.Controls .Add(myTextBox) .Add(myComboBox) .Add(myRTFBox) .Add(myMaskBox) .Add(MyTools) End With For Each c As Control In Me.Controls c.Left = 10 : c.Width = Me.Width - 2 * c.Left Try ' Zur Unterdrückung eingebauter Contextmenüs c.ContextMenu = myContextMenu Catch End Try Next c End Sub Private Sub KeyIsDown(ByVal sender As Object, ByVal e As KeyEventArgs) Handles _ myTextBox.KeyDown, myMaskBox.KeyDown, _ myComboBox.KeyDown, myRTFBox.KeyDown, _ MyToolTextBox.KeyDown, MyToolComboBox.KeyDown ' Sonderzeichen behandeln, deren Ausführung zu einer ' nicht regelgerechten Zeichenfolge im Textfeld führen würde Dim text As String = "", Curspos, SelLength As Integer GetControlProperties(sender, text, Curspos, SelLength) Dim text_OutOfRule As Boolean = False If e.KeyCode = Keys.Delete And sellength > 0 Then ' markierte Zeichen sollen durch 'Entf' gelöscht werden Dim s1 As String = "", s2 As String = "" If curspos > 1 Then s1 = text.Substring(0, curspos) If Curspos + SelLength < text.Length Then _ s2 = text.Substring(Curspos + SelLength) text_OutOfRule = OutOfRule(s1 & s2) ElseIf e.KeyCode = Keys.Back Or e.KeyCode = Keys.Delete Then ' ein einzelnes Zeichen soll durch '<-' bzw. 'Entf' gelöscht werden Dim s1 As String = "", s2 As String = "" If Curspos > 1 Then s1 = text.Substring(0, Curspos - 1) If Curspos < text.Length Then s2 = text.Substring(Curspos) text_OutOfRule = OutOfRule(s1 & s2) End If ' Falls der Text nach dem Entfernen des Zeichens nicht den Regeln ' entspricht, wird die Tastenverarbeitung unterdrückt e.SuppressKeyPress = text_OutOfRule End Sub Private Sub KeyIsPressed(ByVal sender As Object, ByVal e As KeyPressEventArgs) Handles _ myTextBox.KeyPress, myMaskBox.KeyPress, _ myComboBox.KeyPress, myRTFBox.KeyPress, _ MyToolTextBox.KeyPress, MyToolComboBox.KeyPress ' Das Ereignis, in dem der Filtervorgang erfolgt ' (für alle TextControls: siehe "Handles") Dim text As String = "", Curspos, SelLength As Integer GetControlProperties(sender, text, Curspos, selLength) Dim s1 As String = "", s2 As String = "" If Curspos > 0 Then s1 = text.Substring(0, Curspos) If Curspos < text.Length Then s2 = text.Substring(Curspos) ' Falls der Text nicht den Regeln entspricht, ' wird die Taste nicht weiter verarbeitet, sondern ' als bereits erledigt (=handled) markiert If OutOfRule(s1 & e.KeyChar & s2) Then e.Handled = True End Sub Private Sub GetControlProperties(ByVal ctrl As Object, ByRef text As String, _ ByRef Curspos As Integer, ByRef SelLength As Integer) ' Alle Text-Steuerelemente enthalten die ' Eigenschaften "Text", "SelectionStart", "SelectionLength", die ' durch System.Reflection.PropertyInfo abgefragt werden können text = CStr(ctrl.GetType.GetProperty("Text").GetValue(ctrl, Nothing)) Curspos = CInt(ctrl.GetType.GetProperty("SelectionStart").GetValue(ctrl, Nothing)) SelLength = CInt(ctrl.GetType.GetProperty("SelectionLength").GetValue(ctrl, Nothing)) End Sub Private Function OutOfRule(ByVal text As String) As Boolean ' Hier die Eingabe-Restriktionen programmieren ' Das Newline-Zeichen kann man in Multiline-Controls vor der ' Prüfung aussondern damit zeilenübergreifend und beim Löschen ' ' kein unerlaubter Text entstehen kann text = text.Replace(System.Environment.NewLine, "") ' case-sensitive If text.Contains("abc") Then Return True If text.Contains("xyz") Then Return True ' all cases ' If text.ToUpper.Contains("ABC") Then Return True ' If text.ToUpper.Contains("XYZ") Then Return True Return False End Function End Class Dieser Tipp wurde bereits 15.102 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 (einschl. Beispielprojekt!) Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
sevISDN 1.0 Überwachung aller eingehender Anrufe! Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Tipp des Monats Dezemeber 2024 Roland Wutzke MultiSort im ListView-Control Dieses Beispiel zeigt, wie sich verschiedene Sortierfunktionen für ein ListView Control realisieren lassen. sevAniGif (VB/VBA) Anzeigen von animierten GIF-Dateien Ab sofort lassen sich auch unter VB6 und VBA (Access ab Version 2000) animierte GIF-Grafiken anzeigen und abspielen, die entweder lokal auf dem System oder auf einem Webserver gespeichert sind. |
||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |