2017-12-04 8 views
2

Ich habe viele Textfelder auf meinem Formular (um 70). Ich möchte, dass sie nur den HEX-Wert akzeptieren. Ich muss KeyPress-Ereignis für jedes der Textfelder manuell schreiben, und es ist ein wenig frustrierend. Kann man das kürzer machen?machen multiple keypress event kürzer vb.net

Private Sub TextBox66_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox66.KeyPress 
     If Not "1234567890ABCDEF".Contains(Char.ToUpper(e.KeyChar)) AndAlso e.KeyChar <> vbBack Then 
      e.Handled = True 
     End If 
    End Sub 
    Private Sub TextBox65_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox65.KeyPress 
     If Not "1234567890ABCDEF".Contains(Char.ToUpper(e.KeyChar)) AndAlso e.KeyChar <> vbBack Then 
      e.Handled = True 
     End If 
    End Sub 
    Private Sub TextBox64_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox64.KeyPress 
     If Not "1234567890ABCDEF".Contains(Char.ToUpper(e.KeyChar)) AndAlso e.KeyChar <> vbBack Then 
      e.Handled = True 
     End If 
    End Sub 
    Private Sub TextBox63_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox63.KeyPress 
     If Not "1234567890ABCDEF".Contains(Char.ToUpper(e.KeyChar)) AndAlso e.KeyChar <> vbBack Then 
      e.Handled = True 
     End If 
    End Sub 
    Private Sub TextBox62_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox62.KeyPress 
     If Not "1234567890ABCDEF".Contains(Char.ToUpper(e.KeyChar)) AndAlso e.KeyChar <> vbBack Then 
      e.Handled = True 
     End If 
    End Sub 
    Private Sub TextBox61_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox61.KeyPress 
     If Not "1234567890ABCDEF".Contains(Char.ToUpper(e.KeyChar)) AndAlso e.KeyChar <> vbBack Then 
      e.Handled = True 
     End If 
    End Sub 
    Private Sub TextBox52_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox52.KeyPress 
     If Not "12345678".Contains(Char.ToUpper(e.KeyChar)) AndAlso e.KeyChar <> vbBack Then 
      e.Handled = True 
     End If 
    End Sub 
    Private Sub TextBox60_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox60.KeyPress 
     If Not "1234567890ABCDEF".Contains(Char.ToUpper(e.KeyChar)) AndAlso e.KeyChar <> vbBack Then 
      e.Handled = True 
     End If 
    End Sub 
    Private Sub TextBox59_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox59.KeyPress 
     If Not "1234567890ABCDEF".Contains(Char.ToUpper(e.KeyChar)) AndAlso e.KeyChar <> vbBack Then 
      e.Handled = True 
     End If 
    End Sub 

Antwort

2

Try this:

Erstellen Sie die Eventhandler einmal aus dem Formularladeereignis. Auf diese Weise erstellen Sie keinen redundanten Code. Diese

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    For Each textbox As TextBox In Me.Controls.OfType(Of TextBox) 
     If textbox.Name.StartsWith('TextHex') Then 
      AddHandler textbox.KeyPress, AddressOf OnTextBoxKeyPress 
     End If 
    Next 
End Sub 

ist für jeden Tastendruck auf Ihrer Textbox genannt

Private Sub OnTextBoxKeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) 
    If Not "1234567890ABCDEF".Contains(Char.ToUpper(e.KeyChar)) AndAlso e.KeyChar <> vbBack Then 
     e.Handled = True 
    End If 
End Sub 

Schließlich tun, um eine Bereinigung durch die Eventhandler entfernen wir während Form Last definiert.

Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing 
    For Each textbox As TextBox In Me.Controls.OfType(Of TextBox) 
     If textbox.Name.StartsWith('TextHex') Then 
      RemoveHandler textbox.KeyPress, AddressOf OnTextBoxKeyPress 
     End If 
    Next 
End Sub 

Wenn Ihre Textfelder in einem anderen Steuerelement (groupbox, Panel) sind, dann sollten Sie den Bereich in dem for-Schleife von Me.Controls verwendet ändern (Namen des groupbox/Platte) .Controls

+1

Ich würde upvote Ihre Antwort, wenn Sie war eine Erklärung für deinen Code (nicht nur * was * du machst, sondern * warum *). –

+0

Danke, aber wenn ich wenige Textfelder habe, die nur numerische Werte akzeptieren sollten? Mit Ihrem Code, wie ich es bekam, wird es alle Textfelder akzeptieren nur Hex-Werte –

+2

Dann können Sie Ihre Textfelder wie TextHex1, TextHex2 und so weiter benennen. Fügen Sie dann in der Schleife, die die Ereignisbehandlungsroutinen erstellt, einen Test hinzu, ob der Name der Textbox mit "TextHex" beginnt. Wenn dies der Fall ist, erstellen Sie den Handler. Tun Sie es nicht, wenn nicht. Und benenne deine nicht-hexadezimalen Textfelder auf eine andere Art, dass sie nicht mit 'TextHex' beginnen. –

2

Sie Sie können nach dem Schlüsselwort "Handles" auch so viele Textfelder auflisten, wie Sie möchten. nur sie wie folgt durch Kommas getrennt:

Private Sub TextBox_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox52.KeyPress, TextBox59.KeyPress, TextBox60.KeyPress, TextBox61.KeyPress, TextBox62.KeyPress, TextBox63.KeyPress, TextBox64.KeyPress, TextBox65.KeyPress,TextBox66.KeyPress 
    If Not "1234567890ABCDEF".Contains(Char.ToUpper(e.KeyChar)) AndAlso e.KeyChar <> vbBack Then 
     e.Handled = True 
    End If 
End Sub 

Wenn Sie jemals die Quelle Textbox benötigen, warf den „Absender“ Parameter an eine lokale Variable vom Typ TextBox:

Private Sub TextBox_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox52.KeyPress, TextBox59.KeyPress, TextBox60.KeyPress, TextBox61.KeyPress, TextBox62.KeyPress, TextBox63.KeyPress, TextBox64.KeyPress, TextBox65.KeyPress,TextBox66.KeyPress 
    Dim tb As TextBox = DirectCast(sender, TextBox) 
    If Not "1234567890ABCDEF".Contains(Char.ToUpper(e.KeyChar)) AndAlso e.KeyChar <> vbBack Then 
     e.Handled = True 
    End If 
End Sub