Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Meta en 11 Septiembre 2014, 11:46 am



Título: Controlar los caracteres que se escriben en un TextBox
Publicado por: Meta en 11 Septiembre 2014, 11:46 am
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.


Título: Re: Conseguir una cosa
Publicado por: El Benjo en 11 Septiembre 2014, 22:20 pm
Echa un vistazo a esto: http://msdn.microsoft.com/en-us/library/system.windows.controls.textbox.onkeydown(v=vs.95).aspx (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.


Título: Re: Conseguir una cosa
Publicado por: Eleкtro en 12 Septiembre 2014, 00:08 am
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.aspx

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

C#:
Código
  1. int AlphaNumericLength = 10;
  2. // Aceptar el primer caracter como un caracter alfabético, plus 10 caracteres alfanuméricos (no se permiten espacios).
  3. MaskedTextBox1.Mask = "L" + new string("A", AlphaNumericLength);
  4.  
  5. //=======================================================
  6. //Service provided by Telerik (www.telerik.com)
  7. //Conversion powered by NRefactory.
  8. //Twitter: @telerik
  9. //Facebook: facebook.com/telerik
  10. //=======================================================



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
  1. Public Class TextBox_FormTest
  2.  
  3.    Private Sub TextBox_FormTest_Load() Handles MyBase.Load
  4.  
  5.        ' Opcionalmente y para no complicarte más el código (procesando Windows Messages),
  6.        ' deshabilitar el menú contextual directamente (Copy/Paste/Cut).
  7.        TextBox1.ContextMenu = New ContextMenu
  8.  
  9.    End Sub
  10.  
  11.    Private Sub TextBox1_KeyDown(ByVal sender As Object, ByVal e As KeyEventArgs) _
  12.    Handles TextBox1.KeyDown
  13.  
  14.        Dim tb As TextBox = DirectCast(sender, TextBox)
  15.  
  16.        ' Los caracteres aceptados para usarse como primer caracter del Textbox.
  17.        Const AllowedFirstChar As String = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
  18.  
  19.        ' Si se presionó la combinación "Control + V" entonces...
  20.        If (e.Modifiers = Keys.Control AndAlso e.KeyCode = Keys.V) Then
  21.  
  22.            ' Si el cursor de texto se encuentra al principio del texto.
  23.            If tb.SelectionStart = 0 Then
  24.  
  25.                ' Solo permitir pegado si el primer caracter del texto a pegar está dentro de 'AllowedFirstChar'.
  26.                e.Handled = Not AllowedFirstChar.Contains(Clipboard.GetText.First)
  27.  
  28.            Else ' El cursor de texto NO se encuentra al principio del texto.
  29.                e.Handled = True ' Permitir pegado.
  30.  
  31.            End If ' tb.SelectionStart = 0
  32.  
  33.            ' Si se presionó la combinación "Control + X", o también la tecla de retroceso entonces...
  34.        ElseIf (e.Modifiers = Keys.Control AndAlso e.KeyCode = Keys.X) _
  35.        OrElse e.KeyCode.Equals(Keys.Back) Then
  36.  
  37.            ' Obtengo el caracter que hay delante (si alguno).
  38.            ' Ejemplo: En la caneda "H3", obtengo el "3".
  39.            Dim NextChar As Char
  40.  
  41.            If tb.TextLength > tb.SelectionStart + tb.SelectionLength Then
  42.                NextChar = tb.Text(tb.SelectionStart + tb.SelectionLength)
  43.            End If
  44.  
  45.            Select Case NextChar.Equals(Nothing)
  46.  
  47.                Case True ' El caracter está vacio.
  48.                    e.Handled = (Not tb.SelectionStart > 1) AndAlso
  49.                                (Not tb.SelectedText = tb.Text) AndAlso
  50.                                (Not tb.TextLength = 1)
  51.  
  52.                Case Else ' El caracter NO está vacio.
  53.                    ' Permitir el corte en caso de que el siguiente caracter esté dentro de 'AllowedFirstChar'
  54.                    ' Ejemplo Permitido: "AB" > "B"
  55.                    ' Ejemplo Denegado : "A1" > "1"
  56.                    e.Handled = (Not tb.SelectionStart > 1I And Not AllowedFirstChar.Contains(NextChar)) AndAlso
  57.                                (Not tb.SelectedText = tb.Text) AndAlso
  58.                                (Not tb.TextLength = 1I)
  59.  
  60.            End Select ' NextChar.Equals(Nothing)
  61.  
  62.        Else ' Se presionó culquier otra tecla.
  63.  
  64.            ' Si el cursor de texto se encuentra al principio del texto.
  65.            If tb.SelectionStart = 0 Then
  66.  
  67.                ' Solo permitir caracteres dentro de 'AllowedFirstChar' o teclas de movimiento.
  68.                e.Handled = Not AllowedFirstChar.Contains(Convert.ToChar(e.KeyCode)) AndAlso
  69.                            Not {Keys.Left, Keys.Up, Keys.Right, Keys.Down}.Contains(e.KeyCode)
  70.  
  71.            Else ' El cursor de texto NO se encuentra al principio del texto.
  72.  
  73.                ' No permitir espacios.
  74.                e.Handled = e.KeyCode.Equals(Keys.Space)
  75.  
  76.            End If ' tb.SelectionStart = 0
  77.  
  78.        End If ' e.Modifiers, e.KeyCode
  79.  
  80.        e.SuppressKeyPress = e.Handled
  81.  
  82.    End Sub
  83.  
  84. End Class

C#:
Código
  1. using Microsoft.VisualBasic;
  2. using System;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using System.Data;
  6. using System.Diagnostics;
  7. public class TextBox_FormTest
  8. {
  9.  
  10.  
  11. private void TextBox_FormTest_Load()
  12. {
  13. // Opcionalmente y para no complicarte más el código (procesando Windows Messages),
  14. // deshabilitar el menú contextual directamente (Copy/Paste/Cut).
  15. TextBox1.ContextMenu = new ContextMenu();
  16.  
  17. }
  18.  
  19.  
  20. private void TextBox1_KeyDown(object sender, KeyEventArgs e)
  21. {
  22. TextBox tb = (TextBox)sender;
  23.  
  24. // Los caracteres aceptados para usarse como primer caracter del Textbox.
  25. const string AllowedFirstChar = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
  26.  
  27. // Si se presionó la combinación "Control + V" entonces...
  28.  
  29. if ((e.Modifiers == Keys.Control && e.KeyCode == Keys.V)) {
  30. // Si el cursor de texto se encuentra al principio del texto.
  31.  
  32. if (tb.SelectionStart == 0) {
  33. // Solo permitir pegado si el primer caracter del texto a pegar está dentro de 'AllowedFirstChar'.
  34. e.Handled = !AllowedFirstChar.Contains(Clipboard.GetText.First);
  35.  
  36. // El cursor de texto NO se encuentra al principio del texto.
  37. } else {
  38. e.Handled = true;
  39. // Permitir pegado.
  40.  
  41. }
  42. // tb.SelectionStart = 0
  43.  
  44. // Si se presionó la combinación "Control + X", o también la tecla de retroceso entonces...
  45.  
  46. } else if ((e.Modifiers == Keys.Control && e.KeyCode == Keys.X) || e.KeyCode.Equals(Keys.Back)) {
  47. // Obtengo el caracter que hay delante (si alguno).
  48. // Ejemplo: En la caneda "H3", obtengo el "3".
  49. char NextChar = '\0';
  50.  
  51. if (tb.TextLength > tb.SelectionStart + tb.SelectionLength) {
  52. NextChar = tb.Text(tb.SelectionStart + tb.SelectionLength);
  53. }
  54.  
  55. switch (NextChar.Equals(null)) {
  56.  
  57. case true:
  58. // El caracter está vacio.
  59. e.Handled = (!(tb.SelectionStart > 1)) && (!(tb.SelectedText == tb.Text)) && (!(tb.TextLength == 1));
  60.  
  61. break;
  62. default:
  63. // El caracter NO está vacio.
  64. // Permitir el corte en caso de que el siguiente caracter esté dentro de 'AllowedFirstChar'
  65. // Ejemplo Permitido: "AB" > "B"
  66. // Ejemplo Denegado : "A1" > "1"
  67. e.Handled = (!(tb.SelectionStart > 1) & !AllowedFirstChar.Contains(NextChar)) && (!(tb.SelectedText == tb.Text)) && (!(tb.TextLength == 1));
  68.  
  69. break;
  70. }
  71. // NextChar.Equals(Nothing)
  72.  
  73. // Se presionó culquier otra tecla.
  74. } else {
  75.  
  76. // Si el cursor de texto se encuentra al principio del texto.
  77.  
  78. if (tb.SelectionStart == 0) {
  79. // Solo permitir caracteres dentro de 'AllowedFirstChar' o teclas de movimiento.
  80. e.Handled = !AllowedFirstChar.Contains(Convert.ToChar(e.KeyCode)) && !{
  81. Keys.Left,
  82. Keys.Up,
  83. Keys.Right,
  84. Keys.Down
  85. }.Contains(e.KeyCode);
  86.  
  87. // El cursor de texto NO se encuentra al principio del texto.
  88. } else {
  89.  
  90. // No permitir espacios.
  91. e.Handled = e.KeyCode.Equals(Keys.Space);
  92.  
  93. }
  94. // tb.SelectionStart = 0
  95.  
  96. }
  97. // e.Modifiers, e.KeyCode
  98.  
  99. e.SuppressKeyPress = e.Handled;
  100.  
  101. }
  102. public TextBox_FormTest()
  103. {
  104. Load += TextBox_FormTest_Load;
  105. }
  106.  
  107. }
  108.  
  109. //=======================================================
  110. //Service provided by Telerik (www.telerik.com)
  111. //Conversion powered by NRefactory.
  112. //Twitter: @telerik
  113. //Facebook: facebook.com/telerik
  114. //=======================================================
  115.  

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.