No se considera un título descriptivo: "Conseguir una cosa"
Respetar las normas del foro.
Puedo 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.aspxVB.NET:
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#:
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:
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#:
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.