El código que has puesto tiene varios fallos de diseño:
1. El usuario puede insertar caracteres considerados como letras en la categoría Unicode, pero que no son letras como tal, como por ejemplo los símbolos "º" y "ª" (primero, primera) del Español. Aparte hay que tener en cuenta que también se puede insertar cualquier caracter considerado letra de cualquier abecedario aparte del abecedario Inglés y Español, como por ejemplo el Árabe (ej. "غ" y "ظ").
2. El usuario puede usar la combinación de teclas 'CTRL+V' para insertar cualquier otro tipo de caracter.
3. El usuario puede usar el menú contextual del control (opción "Pegar") para insertar cualquier otro tipo de caracter.
A menos que realmente quieras permitir el uso de símbolos como las que mencioné, y de letras de otras culturas (ej. Árabe), yo te sugiero que declares una variable con los caracteres que realmente quieres permitir, y arregles los otros fallos de diseño que mencioné. El resultado podría ser el siguiente:
Private ReadOnly allowedChars As Char() =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZçñÇÑ ".ToCharArray()
''' <summary>
''' Handles the <see cref="TextBox.MouseEnter"/> event of the <see cref="TextBox1"/> control.
''' </summary>
''' <param name="sender">
''' The source of the event.
''' </param>
''' <param name="e">
''' The <see cref="EventArgs"/> instance containing the event data.
''' </param>
Private Sub TextBox_MouseEnter(ByVal sender As Object, ByVal e As EventArgs) Handles TextBox1.MouseEnter
Dim tb As TextBox = DirectCast(sender, TextBox)
' Disable default contextmenu by creating a new empty one.
If (tb.ContextMenuStrip Is Nothing) Then
tb.ContextMenuStrip = New ContextMenuStrip()
End If
End Sub
''' <summary>
''' Handles the <see cref="TextBox.KeyPress"/> event of the <see cref="TextBox1"/> control.
''' </summary>
''' <param name="sender">
''' The source of the event.
''' </param>
''' <param name="e">
''' The <see cref="KeyPressEventArgs"/> instance containing the event data.
''' </param>
Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs) Handles TextBox1.KeyPress
Select Case e.KeyChar
Case Convert.ToChar(Keys.Enter)
' Invoke associated action when the user press Enter key.
' eg. Button1.PerformClick()
Case Convert.ToChar(Keys.Back)
' Allow backspace to delete characters.
e.Handled = False
Case Convert.ToChar(Keys.Capital Or Keys.RButton) ' CTRL+V.
' Allow paste from clipboard if the content does not contain illegal characters.
e.Handled = Not Clipboard.GetText().All(Function(c As Char) Me.allowedChars.Contains(c))
Case Else
If Char.IsControl(e.KeyChar) Then
' Allow Cut (CTRL+X), Copy (CTRL+C), Undo (CTRL+Z) and Redo (CTRL+Y).
e.Handled = False
Else
' Allow only allowed characters.
e.Handled = Not Me.allowedChars.Contains(e.KeyChar)
End If
End Select
End Sub
el cual lo estoy usando en 3 textboxt 2 almenos , el problema esta que me funciona en el primero pero al querer escribir en alguno de los otros 3 textboxt automaticamente se escrie en el primer textboxt a que se debe esto :C
Recuerda que la sentencia
Handles de VB.NET nos permite suscribir un mismo controlador de eventos a varios eventos/controles a usando la siguiente sintaxis:
Private Sub TextBox_KeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs) Handles TextBox1.KeyPress, TextBox2.KeyPress, TextBox3.KeyPress
' ...
End Sub
El método
TextBox_KeyPress estaría suscrito al evento
TextBox.KeyPress de los controles:
TextBox1,
TextBox2 y
TextBox3. Esto quiere decir que no necesitas declarar 3 controladores de eventos diferentes para copiar el mismo código 3 veces en cada uno de ellos...
Saludos.