Interceptar las teclas del teclado en un TextBox

2329 vistas

Vamos a ayudarnos de los eventos de las teclas. Estos se producen cuando el TextBox tiene el foco y en el orden siguiente:

  • KeyDown: la tecla se ha presionado
  • KeyPress: se dispara si la tecla representa un carácter.
  • KeyUp: la tecla se ha soltado

Veamos un ejemplo de uso:

Creamos un proyecto WinForm C#, le añadimos 2 TextBox (textBox1 y textBox2) al form principal (Form1) y el código siguiente para que las teclas pulsadas en textBox1 se representen en textBox2



vbnet
  1. ' KeyPress Handler
  2. Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) _
  3.             Handles TextBox1.KeyPress
  4.  
  5.     ' mostramos los carácteres imprimibles
  6.     If Not Char.IsControl(e.KeyChar) Then
  7.         TextBox2.Text = TextBox1.Text.Substring(0, TextBox1.SelectionStart) + _
  8.             e.KeyChar.ToString + _
  9.             TextBox1.Text.Substring(TextBox1.SelectionStart + _
  10.             TextBox1.SelectionLength)
  11.     End If
  12.  
  13. End Sub
  14.  
  15. ' KeyDown Handler
  16. Private Sub textBox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) _
  17.             Handles TextBox1.KeyDown
  18.  
  19.     ' Gestión tecla Back
  20.     If e.KeyCode = Keys.Back AndAlso TextBox1.Text.Length > 0 Then
  21.  
  22.         ' borramos selección
  23.         If TextBox1.SelectionLength > 0 Then
  24.             TextBox2.Text = TextBox1.Text.Substring(0, TextBox1.SelectionStart) + _
  25.                             TextBox1.Text.Substring(TextBox1.SelectionStart + _
  26.                             TextBox1.SelectionLength)
  27.         ElseIf TextBox1.SelectionStart > 0 Then
  28.             ' borramos carácter anterior al cursor
  29.             If TextBox1.SelectionStart = TextBox1.Text.Length Then
  30.                 TextBox2.Text = TextBox1.Text.Substring(0, TextBox1.Text.Length - 1)
  31.             Else
  32.                 TextBox2.Text = TextBox1.Text.Substring(0, TextBox1.SelectionStart - 1) + _
  33.                                 TextBox1.Text.Substring(TextBox1.SelectionStart + _
  34.                                 TextBox1.SelectionLength)
  35.             End If
  36.         End If
  37.  
  38.     ' Tecla Delete (suppr)
  39.     ElseIf e.KeyCode = Keys.Delete AndAlso TextBox1.Text.Length > 0 Then
  40.  
  41.         ' el cursor está a final de cadena
  42.         If TextBox1.SelectionStart = TextBox1.Text.Length Then
  43.             ' borrado último carácter por Shift+Del
  44.             If e.Shift Then
  45.                 TextBox2.Text = TextBox1.Text.Substring(0, TextBox1.Text.Length - 1)
  46.             End If
  47.         Else
  48.             ' tomamos todos los carácteres a la izquierda del cursor
  49.             TextBox2.Text = TextBox1.Text.Substring(0, TextBox1.SelectionStart)
  50.             If Not (TextBox1.SelectionLength = 0) Then
  51.                 ' borramos selección
  52.                 TextBox2.AppendText(TextBox1.Text.Substring(TextBox1.SelectionStart + TextBox1.SelectionLength))
  53.             Else
  54.                 ' si se pulsa la tecla Control, borramos todos los carácteres a la derecha del cursor,
  55.                 ' sino, borramos sólo uno
  56.                 If Not e.Control Then
  57.                     TextBox2.Text = TextBox1.Text.Substring(0, TextBox1.SelectionStart) + _
  58.                     TextBox1.Text.Substring(TextBox1.SelectionStart + 1)
  59.                 End If
  60.             End If
  61.         End If
  62.  
  63.     ' pegar (Ctrl+V) o (Shift+insert).
  64.     ElseIf (e.Shift AndAlso e.KeyCode = Keys.Insert) OrElse (e.Control AndAlso e.KeyCode = Keys.V) Then
  65.  
  66.         ' datos en el porta papeles
  67.         Dim cpdata As IDataObject = Clipboard.GetDataObject
  68.         ' miramos si cpdata contiene texto
  69.         If Not (cpdata Is Nothing) AndAlso cpdata.GetDataPresent(String.Empty.GetType) Then
  70.             Dim data As String = cpdata.GetData(String.Empty.GetType).ToString
  71.             Dim print As Boolean = False
  72.             ' gestión de carácteres no imprimibles (como la tabulación por ejemplo)
  73.             For i As Integer = 0 To data.Length - 1
  74.                 If Char.IsControl(data, i) AndAlso print Then
  75.                     data = data.Substring(0, i)
  76.                     Exit For
  77.                 ElseIf Not Char.IsControl(data, i) AndAlso Not print Then
  78.                     print = True
  79.                 End If
  80.                 System.Math.Min(System.Threading.Interlocked.Increment(i), i - 1)
  81.             Next
  82.             TextBox2.Text = TextBox1.Text.Substring(0, TextBox1.SelectionStart) + _
  83.                             data + _
  84.                             TextBox1.Text.Substring(TextBox1.SelectionStart + TextBox1.SelectionLength)
  85.         End If
  86.  
  87.     End If
  88.  
  89. End Sub