Controlar los caracteres que se escriben en un TextBox

Iniciado por Meta, 11 Septiembre 2014, 11:46 AM

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

Meta

Hola:

Tengo un Form1 del C# 2013 Express. Puedo usar un textBox o el maskedTextBox. El que realmente sea más fácil de usar para lo que quiero.

En su interior, al escribir, quiero que sea capaz de escribir una sola palabra, que no te deje escribir palabras con espacios en blandco.

A parte de ello, nunca debe empezar una palabra con números, como este ejemplo. 123Hola, 5adios...

Solo que te deje escribir estas cosas así: Hola478, khdgksdgh87568, y5u4j6.

Como si fuera una variable.

Esto de no controlar caracteres no me ha salido en todo el momento.

¿Cómo se puede hacer?

Saludo.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

El Benjo

Echa un vistazo a esto: http://msdn.microsoft.com/en-us/library/system.windows.controls.textbox.onkeydown(v=vs.95).aspx

Ahí viene una propiedad muy interesante de la variable 'e' que es 'handled'. Mediante esa propiedad puedes cancelar que la tecla pulsada se escriba en el textbox.
www.es.neftis-ai.com

Sí hay un mejor lenguaje de programación y es ese con el que puedes desarrollar tus objetivos.

Eleкtro

#2
No se considera un título descriptivo: "Conseguir una cosa"
Respetar las normas del foro.





Cita de: Meta en 11 Septiembre 2014, 11:46 AMPuedo usar un textBox o el maskedTextBox. El que realmente sea más fácil de usar para lo que quiero.

Sería más sencillo y simplificado usando una máscara, pero no en este caso, ya que una máscara debe tener una longitud determinada.

-> http://msdn.microsoft.com/en-us/library/system.windows.forms.maskedtextbox.mask%28v=vs.110%29.aspx

VB.NET:
Código (vbnet) [Seleccionar]

Dim AlphaNumericLength As Integer = 10
' Aceptar el primer caracter como un caracter alfabético, plus 10 caracteres alfanuméricos (no se permiten espacios).
MaskedTextBox1.Mask = "L" & New String("A", AlphaNumericLength)


C#:
Código (csharp) [Seleccionar]

int AlphaNumericLength = 10;
// Aceptar el primer caracter como un caracter alfabético, plus 10 caracteres alfanuméricos (no se permiten espacios).
MaskedTextBox1.Mask = "L" + new string("A", AlphaNumericLength);

//=======================================================
//Service provided by Telerik (www.telerik.com)
//Conversion powered by NRefactory.
//Twitter: @telerik
//Facebook: facebook.com/telerik
//=======================================================





Así pues, para lo que pretendes hacer es más correcto usar un TextBox normal y hardcodear las reglas.

El siguiente código actua con estas reglas:

· El primer caracter debe ser alfabético.
· Los caracteres que le procedan serán cualquiera, excluyendo el caracter "espacio".
· No se podrá cortar ni eliminar el primer caracter a menos que el que le proceda sea alfabético.
+
· No se podrá pegar un string y/o caracter al principio del texto a menos que dicho caracter (o el primer caracter del string) sea alfabético.
La implementación de esa última regla (que se me olvidó añadirla al código) la explico al final del post.

Nota: No he testeado la conversión a C#.

VB.NET:
Código (vbnet) [Seleccionar]
Public Class TextBox_FormTest

   Private Sub TextBox_FormTest_Load() Handles MyBase.Load

       ' Opcionalmente y para no complicarte más el código (procesando Windows Messages),
       ' deshabilitar el menú contextual directamente (Copy/Paste/Cut).
       TextBox1.ContextMenu = New ContextMenu

   End Sub

   Private Sub TextBox1_KeyDown(ByVal sender As Object, ByVal e As KeyEventArgs) _
   Handles TextBox1.KeyDown

       Dim tb As TextBox = DirectCast(sender, TextBox)

       ' Los caracteres aceptados para usarse como primer caracter del Textbox.
       Const AllowedFirstChar As String = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"

       ' Si se presionó la combinación "Control + V" entonces...
       If (e.Modifiers = Keys.Control AndAlso e.KeyCode = Keys.V) Then

           ' Si el cursor de texto se encuentra al principio del texto.
           If tb.SelectionStart = 0 Then

               ' Solo permitir pegado si el primer caracter del texto a pegar está dentro de 'AllowedFirstChar'.
               e.Handled = Not AllowedFirstChar.Contains(Clipboard.GetText.First)

           Else ' El cursor de texto NO se encuentra al principio del texto.
               e.Handled = True ' Permitir pegado.

           End If ' tb.SelectionStart = 0

           ' Si se presionó la combinación "Control + X", o también la tecla de retroceso entonces...
       ElseIf (e.Modifiers = Keys.Control AndAlso e.KeyCode = Keys.X) _
       OrElse e.KeyCode.Equals(Keys.Back) Then

           ' Obtengo el caracter que hay delante (si alguno).
           ' Ejemplo: En la caneda "H3", obtengo el "3".
           Dim NextChar As Char

           If tb.TextLength > tb.SelectionStart + tb.SelectionLength Then
               NextChar = tb.Text(tb.SelectionStart + tb.SelectionLength)
           End If

           Select Case NextChar.Equals(Nothing)

               Case True ' El caracter está vacio.
                   e.Handled = (Not tb.SelectionStart > 1) AndAlso
                               (Not tb.SelectedText = tb.Text) AndAlso
                               (Not tb.TextLength = 1)

               Case Else ' El caracter NO está vacio.
                   ' Permitir el corte en caso de que el siguiente caracter esté dentro de 'AllowedFirstChar'
                   ' Ejemplo Permitido: "AB" > "B"
                   ' Ejemplo Denegado : "A1" > "1"
                   e.Handled = (Not tb.SelectionStart > 1I And Not AllowedFirstChar.Contains(NextChar)) AndAlso
                               (Not tb.SelectedText = tb.Text) AndAlso
                               (Not tb.TextLength = 1I)

           End Select ' NextChar.Equals(Nothing)

       Else ' Se presionó culquier otra tecla.

           ' Si el cursor de texto se encuentra al principio del texto.
           If tb.SelectionStart = 0 Then

               ' Solo permitir caracteres dentro de 'AllowedFirstChar' o teclas de movimiento.
               e.Handled = Not AllowedFirstChar.Contains(Convert.ToChar(e.KeyCode)) AndAlso
                           Not {Keys.Left, Keys.Up, Keys.Right, Keys.Down}.Contains(e.KeyCode)

           Else ' El cursor de texto NO se encuentra al principio del texto.

               ' No permitir espacios.
               e.Handled = e.KeyCode.Equals(Keys.Space)

           End If ' tb.SelectionStart = 0

       End If ' e.Modifiers, e.KeyCode

       e.SuppressKeyPress = e.Handled

   End Sub

End Class


C#:
Código (csharp) [Seleccionar]

using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
public class TextBox_FormTest
{


private void TextBox_FormTest_Load()
{
// Opcionalmente y para no complicarte más el código (procesando Windows Messages),
// deshabilitar el menú contextual directamente (Copy/Paste/Cut).
TextBox1.ContextMenu = new ContextMenu();

}


private void TextBox1_KeyDown(object sender, KeyEventArgs e)
{
TextBox tb = (TextBox)sender;

// Los caracteres aceptados para usarse como primer caracter del Textbox.
const string AllowedFirstChar = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

// Si se presionó la combinación "Control + V" entonces...

if ((e.Modifiers == Keys.Control && e.KeyCode == Keys.V)) {
// Si el cursor de texto se encuentra al principio del texto.

if (tb.SelectionStart == 0) {
// Solo permitir pegado si el primer caracter del texto a pegar está dentro de 'AllowedFirstChar'.
e.Handled = !AllowedFirstChar.Contains(Clipboard.GetText.First);

// El cursor de texto NO se encuentra al principio del texto.
} else {
e.Handled = true;
// Permitir pegado.

}
// tb.SelectionStart = 0

// Si se presionó la combinación "Control + X", o también la tecla de retroceso entonces...

} else if ((e.Modifiers == Keys.Control && e.KeyCode == Keys.X) || e.KeyCode.Equals(Keys.Back)) {
// Obtengo el caracter que hay delante (si alguno).
// Ejemplo: En la caneda "H3", obtengo el "3".
char NextChar = '\0';

if (tb.TextLength > tb.SelectionStart + tb.SelectionLength) {
NextChar = tb.Text(tb.SelectionStart + tb.SelectionLength);
}

switch (NextChar.Equals(null)) {

case true:
// El caracter está vacio.
e.Handled = (!(tb.SelectionStart > 1)) && (!(tb.SelectedText == tb.Text)) && (!(tb.TextLength == 1));

break;
default:
// El caracter NO está vacio.
// Permitir el corte en caso de que el siguiente caracter esté dentro de 'AllowedFirstChar'
// Ejemplo Permitido: "AB" > "B"
// Ejemplo Denegado : "A1" > "1"
e.Handled = (!(tb.SelectionStart > 1) & !AllowedFirstChar.Contains(NextChar)) && (!(tb.SelectedText == tb.Text)) && (!(tb.TextLength == 1));

break;
}
// NextChar.Equals(Nothing)

// Se presionó culquier otra tecla.
} else {

// Si el cursor de texto se encuentra al principio del texto.

if (tb.SelectionStart == 0) {
// Solo permitir caracteres dentro de 'AllowedFirstChar' o teclas de movimiento.
e.Handled = !AllowedFirstChar.Contains(Convert.ToChar(e.KeyCode)) && !{
Keys.Left,
Keys.Up,
Keys.Right,
Keys.Down
}.Contains(e.KeyCode);

// El cursor de texto NO se encuentra al principio del texto.
} else {

// No permitir espacios.
e.Handled = e.KeyCode.Equals(Keys.Space);

}
// tb.SelectionStart = 0

}
// e.Modifiers, e.KeyCode

e.SuppressKeyPress = e.Handled;

}
public TextBox_FormTest()
{
Load += TextBox_FormTest_Load;
}

}

//=======================================================
//Service provided by Telerik (www.telerik.com)
//Conversion powered by NRefactory.
//Twitter: @telerik
//Facebook: facebook.com/telerik
//=======================================================


EDITO: Al pulsar Ctrl+V se me olvidó comprobar si el texto a pegar contiene espacios para determinar si permitir el pegado, pero bueno, ya escribí demasiado y no creo que eso se te vaya complicar ya que solo debes seguir los otros ejemplos, o incluso si tienes problemas para seguir el ejemplo puedes recurrir a algo más básico: Clipboard.GetText().Replace(" "c, String.empty)

De nada.