Interceptar las teclas del teclado en un TextBox
Artículo por Club Developers · 11 May 2006
2331 vistas
Vamos a ayudarnos de los eventos de las teclas. Estos se producen cuando el TextBox tiene el foco y en el orden siguiente:
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
- 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
' KeyPress Handler Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) _ Handles TextBox1.KeyPress ' mostramos los carácteres imprimibles If Not Char.IsControl(e.KeyChar) Then TextBox2.Text = TextBox1.Text.Substring(0, TextBox1.SelectionStart) + _ e.KeyChar.ToString + _ TextBox1.Text.Substring(TextBox1.SelectionStart + _ TextBox1.SelectionLength) End If End Sub ' KeyDown Handler Private Sub textBox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) _ Handles TextBox1.KeyDown ' Gestión tecla Back If e.KeyCode = Keys.Back AndAlso TextBox1.Text.Length > 0 Then ' borramos selección If TextBox1.SelectionLength > 0 Then TextBox2.Text = TextBox1.Text.Substring(0, TextBox1.SelectionStart) + _ TextBox1.Text.Substring(TextBox1.SelectionStart + _ TextBox1.SelectionLength) ElseIf TextBox1.SelectionStart > 0 Then ' borramos carácter anterior al cursor If TextBox1.SelectionStart = TextBox1.Text.Length Then TextBox2.Text = TextBox1.Text.Substring(0, TextBox1.Text.Length - 1) Else TextBox2.Text = TextBox1.Text.Substring(0, TextBox1.SelectionStart - 1) + _ TextBox1.Text.Substring(TextBox1.SelectionStart + _ TextBox1.SelectionLength) End If End If ' Tecla Delete (suppr) ElseIf e.KeyCode = Keys.Delete AndAlso TextBox1.Text.Length > 0 Then ' el cursor está a final de cadena If TextBox1.SelectionStart = TextBox1.Text.Length Then ' borrado último carácter por Shift+Del If e.Shift Then TextBox2.Text = TextBox1.Text.Substring(0, TextBox1.Text.Length - 1) End If Else ' tomamos todos los carácteres a la izquierda del cursor TextBox2.Text = TextBox1.Text.Substring(0, TextBox1.SelectionStart) If Not (TextBox1.SelectionLength = 0) Then ' borramos selección TextBox2.AppendText(TextBox1.Text.Substring(TextBox1.SelectionStart + TextBox1.SelectionLength)) Else ' si se pulsa la tecla Control, borramos todos los carácteres a la derecha del cursor, ' sino, borramos sólo uno If Not e.Control Then TextBox2.Text = TextBox1.Text.Substring(0, TextBox1.SelectionStart) + _ TextBox1.Text.Substring(TextBox1.SelectionStart + 1) End If End If End If ' pegar (Ctrl+V) o (Shift+insert). ElseIf (e.Shift AndAlso e.KeyCode = Keys.Insert) OrElse (e.Control AndAlso e.KeyCode = Keys.V) Then ' datos en el porta papeles Dim cpdata As IDataObject = Clipboard.GetDataObject ' miramos si cpdata contiene texto If Not (cpdata Is Nothing) AndAlso cpdata.GetDataPresent(String.Empty.GetType) Then Dim data As String = cpdata.GetData(String.Empty.GetType).ToString Dim print As Boolean = False ' gestión de carácteres no imprimibles (como la tabulación por ejemplo) For i As Integer = 0 To data.Length - 1 If Char.IsControl(data, i) AndAlso print Then data = data.Substring(0, i) Exit For ElseIf Not Char.IsControl(data, i) AndAlso Not print Then print = True End If System.Math.Min(System.Threading.Interlocked.Increment(i), i - 1) Next TextBox2.Text = TextBox1.Text.Substring(0, TextBox1.SelectionStart) + _ data + _ TextBox1.Text.Substring(TextBox1.SelectionStart + TextBox1.SelectionLength) End If End If End Sub