Problema "Solo letras y espacios en un textboxt"

Iniciado por _CrisiS_, 7 Diciembre 2017, 23:38 PM

0 Miembros y 1 Visitante están viendo este tema.

_CrisiS_

Hola amigos tengo un problema estoy usando este codigo para que en un textbox solo se escriban "letras " y el caracter de la barra"espaciadora"
   If Char.IsLetter(e.KeyChar) Then
            e.Handled = False
        ElseIf Char.IsControl(e.KeyChar) Then
            e.Handled = False
        ElseIf Char.IsSeparator(e.KeyChar) Then
            e.Handled = False
        Else
            e.Handled = True
        End If

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

_CrisiS_

Ya descuri el problema era error mio en otra linea de codigo si un mod puede eliminar el mensaje gracias :3

Eleкtro

#2
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:

Código (vbnet) [Seleccionar]
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





Cita de: _CrisiS_ en  7 Diciembre 2017, 23:38 PM
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:
Código (vbnet) [Seleccionar]
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.