IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Sommaire > WinForms > Textbox
        Comment intercepter les touches du clavier dans mon TextBox ?
        Comment ne saisir que des caractères numériques dans mon TextBox ?

        


Comment intercepter les touches du clavier dans mon TextBox ?
auteur : abelman
On se sert des événements de touches. Ils se produisent lorsque le TextBox a le focus dans l'ordre suivant
  • KeyDown :
    Une touche a été enfoncée
  • KeyPress :
    Déclenché si la touche enfoncée représente un caractère. (Il n'est pas déclenché pour les touches F1, F2 par exemple)
  • KeyUp :
    Une touche a été relâchée
Voici un exemple d'utilisation.
Créer un projet WinForm C#
Ajouter deux TextBox à la form principale de votre projet
Le code suivant utilise une form nommée Form1, et deux TextBox nommés textBox1 et textBox2
Toutes les touches frappées sur le textBox1 se répercutent sur textBox2.
Compiler et lancer le projet, puis entrer des données dans textBox1.

'KeyPress Handler Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) _ Handles TextBox1.KeyPress 'On affiche tous les caractères imprimables 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 'Gestion Touche Back If e.KeyCode = Keys.Back AndAlso TextBox1.Text.Length > 0 Then 'Suppression sélection 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 'Suppression caractère précédant le curseur 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 'Touche Delete (suppr) ElseIf e.KeyCode = Keys.Delete AndAlso TextBox1.Text.Length > 0 Then 'Le curseur est en fin de chaîne If TextBox1.SelectionStart = TextBox1.Text.Length Then 'Suppression dernier caractère par Shift+Del If e.Shift Then TextBox2.Text = TextBox1.Text.Substring(0, TextBox1.Text.Length - 1) End If Else 'On prend tous les caractères à gauche du curseur TextBox2.Text = TextBox1.Text.Substring(0, TextBox1.SelectionStart) If Not (TextBox1.SelectionLength = 0) Then 'Suppression de la selection TextBox2.AppendText(TextBox1.Text.Substring(TextBox1.SelectionStart + TextBox1.SelectionLength)) Else 'Si la touche control est enfoncée, tous les caractères 'à droite du curseur seront supprimés. Sinon on en supprime 'un seul 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 'Coller (Ctrl+V) ou (Shift+insert) ElseIf (e.Shift AndAlso e.KeyCode = Keys.Insert) OrElse (e.Control AndAlso e.KeyCode = Keys.V) Then 'Données dans presse papier Dim cpdata As IDataObject = Clipboard.GetDataObject 'Test si cpdata contient du texte 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 'Gestion caractères non imprimables (comme les tabulations par exemple) 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

Comment ne saisir que des caractères numériques dans mon TextBox ?
auteur : abelman
On se sert de l'événement KeyPress pour intercepter les caractères entrés dans le TextBox.
La propriété Handle de la classe KeyPressEventArgs indique à l'application ce qu'il faut faire du caractère intercepté.
Si elle vaut false, le traitement par défaut du caractère (l'affichage pour les caractères imprimables) est appliqué.
Si elle vaut true, c'est votre code qui décide ce qu'il faut faire du caractère. Si vous ne faites rien, il ne sera pas affiché.
Sa valeur par défaut est false.
Exemple simple

Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) _ Handles TextBox1.KeyPress If Not Char.IsDigit(e.KeyChar) Then 'Tous les caractères non numériques ne sont pas traités sur le TextBox. e.Handled = True End If End Sub
Remarquer qu' avec ce code, des touches générant un caractère non imprimable (comme la touche BACK) n'auront aucun effet sur le textbox.
Si vous voulez faire un véritable contrôe TexBox numérique, vous devez en tenir compte, gérer le copier-coller CTRL+C et SHIFT+INS avec l'événement KeyDown, et aussi avec le clic droit (menu contextuel coller) sur la souris.


        

Consultez les autres F.A.Q's

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2005 Abel Mandengue Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.