vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
SEPA-Dateien erstellen inkl. IBAN-, BLZ-/Kontonummernprüfung  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück
Rubrik: Controls · TextBox & RichTextBox   |   VB-Versionen: VB2005, VB200810.11.09
Bestimmte Zeichenfolgen in Textfeldern zensieren

Beispiel, wie man unerwünschte Zeichenfolgen in TextBoxen, ComboBoxen oder RichTextBoxen zensieren kann.

Autor:   Manfred BohnBewertung:     [ Jetzt bewerten ]Views:  14.851 
ohne HomepageSystem:  Win2k, WinXP, Win7, Win8, Win10, Win11 Beispielprojekt auf CD 

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

  • aus dem Zeichen, das der aktuell gedrückten Taste entspricht,
  • der aktuellen Cursorposition und
  • dem bereits eingegebenen Text im Textfeld
den durch den Tastendruck entstehenden Text zusammenbauen.

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.
Das hat (mindestens) zwei Nachteile:

  • die unerlaubte Zeichenfolge wird für einen Sekundenbruchteil im Textfeld sichtbar
  • die unerlaubte Zeichenfolge wird ggf. in ein an das Text-Control gebundenes Objekt übertragen (falls beim Binden als DataSourceUpdateMode "OnPropertyChanged" gesetzt worden ist).

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 14.851 mal aufgerufen.

Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

Über diesen Tipp im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Neue Diskussion eröffnen

nach obenzurück


Anzeige

Kauftipp Unser Dauerbrenner!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.
 
   

Druckansicht Druckansicht Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
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.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel