Developpez.com

Plus de 14 000 cours et tutoriels en informatique professionnelle à consulter, à télécharger ou à visionner en vidéo.

FAQ C#Consultez toutes les FAQ

Nombre d'auteurs : 39, nombre de questions : 272, dernière mise à jour : 24 mai 2015  Ajouter une question

 

Cette FAQ a été réalisée pour répondre aux questions les plus fréquemment posées concernant C# sur le forum Développement DotNET

Je tiens à souligner qu'elle ne garantit en aucun cas que les informations qu'elle contient sont correctes ; les auteurs font le maximum, mais l'erreur est humaine. Si vous trouvez une erreur, ou que vous souhaitez devenir rédacteur, lisez ceci .

Sur ce, je vous souhaite une bonne lecture.

Commentez cette FAQ : Commentez


SommaireWinFormsContrôles d'édition (8)
précédent sommaire suivant
 

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 WinForms 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.


Code c# : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
// KeyPress Handler 
private void textBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e) 
{ 
    // On affiche tous les caractères imprimables 
    if (!char.IsControl(e.KeyChar)) 
        textBox2.Text = textBox1.Text.Substring(0, textBox1.SelectionStart) + 
        e.KeyChar.ToString() + 
        textBox1.Text.Substring(textBox1.SelectionStart + textBox1.SelectionLength); 
} 
  
// KeyDown Handler 
private void textBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) 
{ 
    // Gestion Touche Back 
    if (e.KeyCode == Keys.Back && textBox1.Text.Length > 0) 
    { 
        if (textBox1.SelectionLength > 0) 
        { 
            // Suppression sélection 
            textBox2.Text = textBox1.Text.Substring(0, textBox1.SelectionStart) + 
            textBox1.Text.Substring(textBox1.SelectionStart + textBox1.SelectionLength); 
        } 
        else if (textBox1.SelectionStart > 0) 
        { 
            // Suppression caractère précédant le curseur 
            if (textBox1.SelectionStart == textBox1.Text.Length) 
                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); 
        } 
    } 
    // Touche Delete (suppr) 
    else if (e.KeyCode == Keys.Delete && textBox1.Text.Length > 0) 
    { 
        // Le curseur est en fin de chaine 
        if (textBox1.SelectionStart == textBox1.Text.Length) 
        { 
            // Suppression dernier caractère par Shift+Del 
            if (e.Shift) 
                textBox2.Text = textBox1.Text.Substring(0, textBox1.Text.Length - 1); 
        } 
        else 
        { 
            // On prend tous les caractères à gauche du curseur 
            textBox2.Text = textBox1.Text.Substring(0, textBox1.SelectionStart); 
            if (textBox1.SelectionLength != 0) 
                // 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 (!e.Control) 
                    textBox2.Text = textBox1.Text.Substring(0, textBox1.SelectionStart) + 
                    textBox1.Text.Substring(textBox1.SelectionStart + 1); 
            } 
        } 
    } 
    // Coller (Ctrl+V) ou (Shift+insert). 
    else if ((e.Shift && e.KeyCode == Keys.Insert) || (e.Control && e.KeyCode == Keys.V)) 
    { 
        // Données dans presse papier 
        IDataObject cpdata = Clipboard.GetDataObject(); 
        // Test si cpdata contient du texte 
        if (cpdata != null && cpdata.GetDataPresent(string.Empty.GetType())) 
        { 
            string data = cpdata.GetData(string.Empty.GetType()).ToString(); 
            bool print = false; 
            // Gestion caractères non imprimables (comme les tabulations par exemple) 
            for (int i = 0; i < data.Length - 1; i++) 
            { 
                if (char.IsControl(data, i) && print) 
                { 
                    data = data.Substring(0, i); 
                    break; 
                } 
                else if (!char.IsControl(data, i) && !print) 
                    print = true; 
            } 
            textBox2.Text = textBox1.Text.Substring(0, textBox1.SelectionStart) + 
            data + 
            textBox1.Text.Substring(textBox1.SelectionStart + textBox1.SelectionLength); 
        } 
    } 
}

Mis à jour le 2 novembre 2004 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 :

Code c# : Sélectionner tout
1
2
3
4
5
6
private void textBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e) 
{ 
    if (!char.IsDigit(e.KeyChar)) 
        // Tous les caractères non numériques ne sont pas traités sur le TextBox. 
        e.Handled = true; 
}
Remarquez 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ôle TextBox 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.

Mis à jour le 2 novembre 2004 abelman

Dans le Validating du ou des TextBox : - pour des nombres réels :

Code c# : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
private void TextBox_Validating(object sender, CancelEventArgs e) 
{ 
    if (sender is TextBox) 
    { 
        TextBox T = ((TextBox)sender); 
        try 
        { 
            Double.Parse(T.Text); 
            epErrorProvider.SetError(T, ""); 
        } 
        catch (ArgumentNullException) 
        { 
            epErrorProvider.SetError(T, "La case ne peut être vide !"); 
            T.SelectAll(); 
            e.Cancel = true; 
        } 
        catch (OverflowException) 
        { 
            epErrorProvider.SetError(T, "Le nombre est trop grand !"); 
            T.SelectAll(); 
            e.Cancel = true; 
        } 
        catch (FormatException) 
        { 
            epErrorProvider.SetError(T, "Le format n'est pas correct"); 
            T.SelectAll(); 
            e.Cancel = true; 
        } 
    } 
}
- pour des nombres décimaux :

Code c# : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
private void TextBox_Validating(object sender, CancelEventArgs e) 
{ 
    if (sender is TextBox) 
    { 
        TextBox T = ((TextBox)sender); 
        try 
        { 
            Decimal.Parse(T.Text); 
            epErrorProvider.SetError(T, ""); 
        } 
        catch (ArgumentNullException) 
        { 
            epErrorProvider.SetError(T, "La case ne peut être vide !"); 
            T.SelectAll(); 
            e.Cancel = true; 
        } 
        catch (OverflowException) 
        { 
            epErrorProvider.SetError(T, "Le nombre est trop grand !"); 
            T.SelectAll(); 
            e.Cancel = true; 
        } 
        catch (FormatException) 
        { 
            epErrorProvider.SetError(T, "Le format n'est pas correct"); 
            T.SelectAll(); 
            e.Cancel = true; 
        } 
    } 
}
N'oubliez pas de mettre le bon caractère comme séparateur decimal :

Code c# : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
private void TextBox_KeyPress(object sender, KeyPressEventArgs e) 
{ 
    // stoque le séparateur décimal du système 
    char Separateur = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator[0]; 
    // dans le cas de l'ecriture d'un séparateur 
    if ((e.KeyChar == '.') || (e.KeyChar == ',')) 
    { 
        // Force l'ecriture du bon séparateur 
        e.KeyChar = Separateur; 
    } 
}
- pour des nombres entiers :

Code c# : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
private void TextBox_Validating(object sender, CancelEventArgs e) 
{ 
    if (sender is TextBox) 
    { 
        TextBox T = ((TextBox)sender); 
        try 
        { 
            Integer.Parse(T.Text); 
            epErrorProvider.SetError(T, ""); 
        } 
        catch (ArgumentNullException) 
        { 
            epErrorProvider.SetError(T, "La case ne peut être vide !"); 
            T.SelectAll(); 
            e.Cancel = true; 
        } 
        catch (OverflowException) 
        { 
            epErrorProvider.SetError(T, "Le nombre est trop grand !"); 
            T.SelectAll(); 
            e.Cancel = true; 
        } 
        catch (FormatException) 
        { 
            epErrorProvider.SetError(T, "Le format n'est pas correct"); 
            T.SelectAll(); 
            e.Cancel = true; 
        } 
    } 
}

Mis à jour le 10 avril 2006

En utilisant la classe System.Text.RegularExpressions :

Code c# : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private void TextBox_Validating(object sender, CancelEventArgs e) 
{ 
    TextBox txtChamp = (TextBox)sender; 
  
    Regex rexValideur = new Regex("expression"); 
  
    if (rexValideur.IsMatch(txtChamp.Text)) 
    { 
        epErrorProvider.SetError(txtChamp, ""); 
    } 
    else 
    { 
        epErrorProvider.SetError(txtChamp, "Valeur du champ invalide."); 
        e.Cancel = true; 
    } 
}
Il faut ensuite remplacer expression par une chaine de caractères représentant une expression régulière. Cette méthode est plus recommandée que les try{ } catch{ } car ceux-ci utilisent beaucoup plus de ressources.

Mis à jour le 10 avril 2006 efficks

Il vous faut récupérer les contrôles présents sur le formulaire et tester s'ils sont de type TextBox.

Code c# : Sélectionner tout
1
2
3
4
5
foreach (Control c in Controls) 
{ 
    if (c is TextBox) 
        c.Enabled = false; 
}

Mis à jour le 10 avril 2006 Ditch

Avec la version 2 du Framework, la classe TextBox donne la possibilité de compléter automatiquement les saisies de l'utilisateur. Un peu comme ce que fait déjà votre navigateur.

Pour cela, vous devez utiliser la collection AutoCompleteCustomSource pour spécifier la liste des valeurs que le Textbox pourra proposer.

Code c# : Sélectionner tout
1
2
3
// Activer l'autocompletion 
textBox_Recherche.AutoCompleteSource = AutoCompleteSource.CustomSource; 
textBox_Recherche.AutoCompleteCustomSource.AddRange(new String[]{"Chat", "Cheval", "Chien"});
En plus de cela, il est possible de préciser comment le Textbox doit afficher les propositions : dans une liste (Suggest), directement dans le textbox (Append) ou un mix des 2 solutions précédentes (SuggestAppen).

Code c# : Sélectionner tout
textBox_Recherche.AutoCompleteMode = AutoCompleteMode.SuggestAppend;

Mis à jour le 2 janvier 2007 Jérôme Lambert

Quand on rajoute du texte à un TextBox multiligne avec, par exemple :

Code c# : Sélectionner tout
1
2
for (int i = 0 ; i < 100 ; i++) 
	textBox1.Text += "abc" + Convert.ToString(i) + Environment.NewLine;
le texte s'ajoute bien, mais pour peu que la longueur du texte dépasse la zone visible, on ne voit pas la fin du texte comme il est souvent d'usage.
Pour y remédier, on peut utiliser ces deux lignes de code pour renvoyer le curseur à la fin et provoquer le défilement jusqu'à celui-ci.

Code c# : Sélectionner tout
1
2
textBox1.SelectionStart = textBox1.TextLength; 
textBox1.ScrollToCaret();
On peut aussi envisager de mettre le focus sur le TextBox si besoin :

Code c# : Sélectionner tout
textBox1.Focus();

Mis à jour le 10 juin 2008 nico-pyright(c)

Il n'est pas possible d'écrire le texte d'un label avec plusieurs couleurs par défaut, mais on peut y arriver en créant un nouveau contrôle qui dérive de Label et en surchargeant la méthode OnPaint.

Tout d'abord, créer une classe dérivée de Label et surcharger OnPaint :

Code c# : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class MonLabel : System.Windows.Forms.Label 
{ 
    protected override void OnPaint(PaintEventArgs e) 
	{ 
		Brush []mesCouleurs = { Brushes.Red, Brushes.Orange, Brushes.Green, Brushes.Blue}; 
		int br = 0; 
		string chaine = Text; 
  
		List<string > listString = new List<string>(); 
		StringBuilder sb = new StringBuilder(); 
		for (int i = 0 ; i < chaine.Length ; i++) 
		{ 
			if (chaine[i] == ' ' || chaine[i] == '\'') 
			{ 
				if (chaine[i] == '\'') 
					sb.Append(chaine[i]); 
				listString.Add(sb.ToString()); 
				sb = new StringBuilder(); 
			} 
			else 
				sb.Append(chaine[i]); 
		} 
		listString.Add(sb.ToString()); 
  
		float startX = 0; 
		foreach (string s in listString) 
		{ 
			e.Graphics.DrawString(s, Font, mesCouleurs[br], startX, 0); 
			startX += e.Graphics.MeasureString(s, Font).Width; 
			br++; 
			if (br >= mesCouleurs.Length) 
				br = 0; 
		} 
		Width = (int)startX; 
	} 
}
Ici, j'ai choisi de changer de couleur à chaque espace trouvé ou à chaque « ' » trouvée. J'utilise DrawString pour écrire la partie de mot avec la couleur choisie, et je n'oublie pas de mesurer sa taille pour écrire la partie de mot suivante.
Il faut également adapter la taille du contrôle à la nouvelle taille du texte.

Ensuite, il ne reste plus qu'à utiliser notre contrôle, par exemple dans le constructeur :

Code c# : Sélectionner tout
1
2
3
4
5
MonLabel monLabel = new MonLabel(); 
AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 
monLabel.Font = (new System.Drawing.Font("Microsoft Sans Serif", 8.0F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, (System.Byte)(0))); 
monLabel.Text = "Je m'appelle Nico-pyright(c)"; 
this.Controls.Add(monLabel);

Mis à jour le 10 juin 2008 nico-pyright(c)

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

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 © 2017 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et 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.

 
Responsable bénévole de la rubrique Microsoft DotNET : Hinault Romaric -