52 votes

Comment définir les premiers caractères d'une TextBox WinForms en lecture seule ?

J'ai un formulaire avec une zone de texte qui est utilisée pour entrer une URL. J'ai besoin d'ajouter (http://) comme valeur prédéfinie à cette zone de texte et je veux qu'elle soit en lecture seule afin que l'utilisateur ne puisse pas supprimer le http:// mais qu'il puisse écrire après.

enter image description here

Toute aide serait très appréciée.

48 votes

La solution la plus simple serait de placer simplement le "http://" dans une étiquette avant la zone de texte.

0 votes

Mettez une autre zone de texte à côté et faites en sorte qu'elle soit en lecture seule, mais mettez-les ensemble pour qu'elles aient l'air d'en former une seule. Puis joignez les chaînes dans le code ?

0 votes

Je le sais, mais pour une raison quelconque, je veux l'utiliser comme ça !

64voto

musefan Points 23208

Voici quelques options :

  1. Le moyen le plus simple est de créer un étiquette en dehors de la zone de texte (à gauche) avec ces caractères. (simple et facile à comprendre pour l'utilisateur)

  2. Créez une deuxième zone de texte en lecture seule à utiliser au début, donnez-lui le même style que la zone de saisie et alignez-les l'une à côté de l'autre. Oui, vous obtiendrez une ligne d'un seul pixel pour les séparer, mais je pense que cela ajoutera à l'expérience de l'utilisateur pour qu'il soit évident qu'il ne faut pas jouer avec (je choisirais personnellement cette option).

  3. Si vous avez besoin du style, vous pouvez créez votre propre contrôle d'utilisateur qui utilise un panneau, une étiquette et une zone de texte avec un style de bordure approprié défini selon les besoins. (meilleur moyen d'obtenir le style exact dont vous avez besoin)

  4. La quatrième méthode, plus ennuyeuse, consisterait à gérer l'un des événements clés (comme le KeyDown ) sur la zone de texte elle-même. Avec cela, vous pouvez faire de nombreuses vérifications et modifier la position du curseur pour que cela fonctionne, mais croyez-moi, cela vous fera perdre la tête en essayant de le faire fonctionner parfaitement ! (beaucoup trop de travail difficile à réaliser)

Pour résumer, je pense que option 2 est le meilleur ici. Bien sûr, si vous utilisiez WPF, vous auriez sans doute beaucoup plus de flexibilité dans le style.

49 votes

Option 5 : ajouter implicitement le http:// s'il manque, tout comme le fait un navigateur. Ainsi, lorsque je saisis stackoverflow.com et la zone de texte perd le focus, changez-le en http://stackoverflow.com . S'il commence déjà par http:// le laisser là, ou même accepter plus qu'une simple http comme protocole.

10 votes

N'oubliez pas de donner https:// certains aiment aussi.... et bien que plus rares aujourd'hui, ftp: a toujours sa place.

0 votes

L'option 4 est courante en JavaScript pour des techniques similaires de verrouillage de format.

20voto

Eric Points 806

Avez-vous envisagé de placer une étiquette à côté de la zone de texte avec "http://" comme texte ? Ensuite, lorsque vous acceptez la saisie de l'utilisateur, vous pouvez simplement ajouter le "http://" à votre textbox.Text.

Voici une autre idée :

À chaque fois que vous appuyez sur le retour arrière, comptez le nombre de caractères dans votre zone de texte. S'il est == 7, ignorez le retour arrière. S'il est supérieur, vérifiez le nombre de caractères après le retour arrière. Si le nombre de caractères est inférieur à 7, effacez la zone de texte et réinitialisez le texte.

private void a_keyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == (char)8)
    {
        if (myTextbox.Text.Length == 7)
        // do stuff..
    }
    else if //do stuff...
}

3 votes

L'option d'effacement arrière est une idée originale, mais il ne faut pas oublier les problèmes de collage et de sélection de tout.

0 votes

Si le texte est supérieur à 7, vous pouvez vérifier si le texte commence par http : \\ Si oui, laissez-le, sinon, ajoutez-le. Et je pense que cela couvre toutes les possibilités.

0 votes

Je ne vois pas ce que je pourrais dire pour l'instant ;)

12voto

krillgar Points 2791

Vous pourriez également ne pas afficher le site http:// et vous contenter de l'ajouter au code Textbox.Text. Vérifiez d'abord qu'il ne commence pas par ça aussi.

Pour clarifier ma dernière remarque :

string sURL = txtURL.Text.StartsWith("http://") ? txtURL.Text : "http://" + txtURL.Text;

0 votes

Je suppose qu'il veut l'afficher dans la zone de texte, ce qui explique pourquoi il ne veut pas l'idée de l'étiquette.

0 votes

Je suis d'accord jusqu'à un certain point, mais sans plus de clarification de la part du PO sur ce qu'il essaie d'accomplir et pourquoi, le mieux que nous puissions faire est de lancer quelques suggestions. Ce que je veux dire, c'est qu'il faut maintenir l'adresse http:// dans la valeur de ce qui est récupéré dans la valeur Textbox.Text. Si l'adresse http:// est maintenue dans la boîte à des fins purement esthétiques, alors il faut faire beaucoup plus d'efforts.

0 votes

Qu'est-ce qui les empêche alors de taper dans http:// et provoquant un ajout à http://http://blahblah . Solution évidente pour vérifier avant d'ajouter. +1 cependant, car je ne pense pas qu'elle ait été suggérée par quelqu'un d'autre, mais c'est une idée valable. Il fait le tour de l'idée d'une section en lecture seule ;)

6voto

Quelque chose comme ça ?

private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
{
    var textBox = sender as TextBox;

    if (!textBox.Text.StartsWith("http://"))
    {
        textBox.Text = "http://";
        textBox.Select(textBox.Text.Length, 0);

    }
}

0 votes

C'est plus proche de ce qu'il recherche, mais s'il tape une URL entière, puis revient en arrière et change le début, tout sera effacé.

0 votes

Le texte reste cependant supprimable.

1 votes

10% pour un hack... essayez avec KeyDown pour le faire passer à 25% de réussite ;)

5voto

Hans Passant Points 475940

Vous pourriez utiliser une RichTextBox à la place, elle permet de protéger le texte :

    public Form1() {
        InitializeComponent();
        richTextBox1.Text = "http://";
        richTextBox1.SelectAll();
        richTextBox1.SelectionProtected = true;
        richTextBox1.SelectionStart = richTextBox1.Text.Length;
        richTextBox1.DetectUrls = false;  // optional
    }

Mais malheureusement, il ne fonctionne pas bien si vous définissez sa propriété Multiline sur False.

Une façon pragmatique de le faire avec une TextBox est de la remettre comme vous le souhaitez. Cela fonctionne également avec les collages et les suppressions de sélection :

    string protect = "http://";

    private void textBox1_TextChanged(object sender, EventArgs e) {
        if (!textBox1.Text.StartsWith(protect)) {
            textBox1.Text = protect;
            textBox1.SelectionStart = textBox1.Text.Length;
        }
    }

2 votes

Bonne idée avec la RTB, mais le style de cette zone entrera en conflit avec les autres styles de zones de texte :(

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X