IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

[C#] Mise en forme d'un RichTextBox


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8
    Par défaut [C#] Mise en forme d'un RichTextBox
    Bonjour,

    J'utilise actuellement le contrôle RichTextBox et j'ai quelque problèmes.
    J'ai développé un UserControle capable de fonctionner comme un traitement de texte. L'utilisateur sait donc éditer un texte, sélectionner une partie de celui-ci et en changer la font et son style à l'aide de différents boutons, etc. Bref, rien de compliqué jusque là.

    Ensuite, j’ai développé un système permettant la génération automatisée de document qui fonctionne en gros comme ceci :

    J'ai un document de base (template) avec une balise "< AUTEUR >". Lorsque l’utilisateur crée un document automatisé, le programme va rechercher automatiquement son nom, prénom, adresse et plein d'autre données le concernant dans une base de donnée.
    Il va remplacer la balise par ces données. Là non plus, aucuns problèmes.

    Là où ça se corse c'est que j'aimerai par exemple mettre le Nom en gras, l'adresse en italique et le code postal en souligné.

    Pour ce faire, dans mon code je sélectionne le nom puis je change sa font comme ceci.

    MyRichTextBox.SelectionFont = New Font("Tahoma", 12, FontStyle.Bold);
    // Je sélectionne ensuite l’adresse
    MyRichTextBox.SelectionFont = New Font("Tahoma", 12, FontStyle.Italic);
    // En ensuite le code postal
    MyRichTextBox.SelectionFont = New Font("Tahoma", 12, FontStyle.Underline);

    Le problème est le suivant :

    Seul le code postal est modifié. En réalité, c’est seulement la dernière zone sélectionnée dans le code qui est modifiée (J’ai testé en changeant l’ordre et c’est bien ça).

    On dirait qu'il faut à chaque changement de font, un retour au runtime pour que ça fonctionne. Enfin je le conçois comme ça.

    Je rappel que je suis en C# et que les balises tel que "\b" "\b0" ne fonctionnent pas.

    Quelle est l'alternative pour C# ? (Si elle existe).

    N'hésitez pas à poser des questions car j'ai essayé d'expliquer le problème au mieux mais c'est assez dur

    Merci d’avance pour vos propositions.

  2. #2
    jab
    jab est déconnecté
    Rédacteur
    Avatar de jab
    Homme Profil pro
    SharePoint developpeur
    Inscrit en
    Février 2004
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : SharePoint developpeur
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 1 173
    Par défaut
    C'est normal qu'il ne modifie que le dernier car c'est le texte qui est sélectionné. Si tu veux modifier le font tu dois sélectionner ton texte. Le plus simple est de changer le font dès que tu as importé un champ.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8
    Par défaut
    Oui, ca je le savais déjà c'est ce que j'ai tenté d'expliquer.

    Le problème c'est que je ne saurais pas changer de font à chaque fois que j'importe vu que je dois tout importer, faire les modifications puis plublier dans la RichTextBox.

    En gros si j'essaye de modifier 2 mots dans la même fonction, il ne tiendra compte que de la 2em modification.

    Le problème reste donc entier.

  4. #4
    jab
    jab est déconnecté
    Rédacteur
    Avatar de jab
    Homme Profil pro
    SharePoint developpeur
    Inscrit en
    Février 2004
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : SharePoint developpeur
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 1 173
    Par défaut
    Peux tu montrer comment tu sélectionnes le texte et tu appliques le style ?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8
    Par défaut
    J'utilise une "pseudo" technique de parsing
    Dans mon texte, j'injecte des balises et ensuite je fais un recherche sur ces balises pour effectuer la mise en forme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    // Mise en forme
    			while(tpExamen.RichTextBox.Text.IndexOf("<b>") != -1)
    			{
    				int Start = tpExamen.RichTextBox.Text.IndexOf("<b>");
    				tpExamen.RichTextBox.Text = tpExamen.RichTextBox.Text.Remove(Start, 3);
    				int End = tpExamen.RichTextBox.Text.IndexOf("</b>");
    				tpExamen.RichTextBox.Text = tpExamen.RichTextBox.Text.Remove(End, 4);
    				tpExamen.RichTextBox.SelectionStart = Start;
    				tpExamen.RichTextBox.SelectionLength = End - Start;
    				tpExamen.RichTextBox.SelectionFont = new Font(tpExamen.RichTextBox.SelectionFont, FontStyle.Bold);
    			}
    Avec cette technique c'est uniquelement le dernier mot/phrase qui est sélectionné qui sera mit en gras.

    Une solution ?

  6. #6
    Membre éprouvé
    Avatar de crjo
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Octobre 2004
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 81
    Par défaut
    Citation Envoyé par Electrochip
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    tpExamen.RichTextBox.Text = tpExamen.RichTextBox.Text.Remove(Start, 3);
     
    tpExamen.RichTextBox.Text = tpExamen.RichTextBox.Text.Remove(End, 4);
    Je pense que ton problème vient de ces 2 lignes dans la boucle où tu modifies le contenu du TextBox.

    • Boucle tour n°1 : tu enlèves les balises, tu sélectionnes le texte qui était entre les balises et tu mets en gras.
    • Boucle tour n°2 : quand tu enlèves la deuxième paire de balise, tu réassignes un string (qui est un texte non formatté) à ton RichTextBox. Du coup, la mise en forme faite au tour précédent est perdue
    • et ainsi de suite; voilà pourquoi on dirait que seule la dernière paire de balises a été traitée.


    Malheureusement, je ne vois pas de solution triviale à ce problème car il faut que tu enlèves tes balises mais sans toucher à RichTextBox.Text...

    tu pourrais peut-être supprimer tes balises en les sélectionnant et en appelant RichTextBox.Cut. J'ai le sentiment que ça marcherait nickel. 8)

  7. #7
    Membre éprouvé
    Avatar de crjo
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Octobre 2004
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 81
    Par défaut
    Je n'ai pas résisté, j'ai fait le test, et c'était bien ça 8) 8) 8)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    int start;
    while( (start = this.richTextBox1.Text.IndexOf("<b>")) != -1) 
    { 
        // sélectionne et supprime la balise <b>
        this.richTextBox1.Select(start, 3);
        this.richTextBox1.Cut();
     
        // sélectionne et supprime la balise </b>
        int end = this.richTextBox1.Text.IndexOf("</b>"); 
        this.richTextBox1.Select(end, 4);
        this.richTextBox1.Cut();
     
        // met en forme ce qui se trouvait entre les balises
        this.richTextBox1.Select(start, end-start);
        this.richTextBox1.SelectionFont = new Font(this.richTextBox1.SelectionFont, FontStyle.Bold);;
    }
    Je conseillerais un RichTextBox.SuspendLayout / ResumeLayout autour de la boucle si tu as beaucoup de balises à traiter. Tu peux également sauvegarder le contenu du presse papier avant la boucle pour pouvoir le restaurer après la boucle car l'opération Cut va modifier le contenu du presse papier (voir la classe Clipboard).

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8
    Par défaut
    Parfait, ca fonctionne.

    J'avais pensé que le format de text n'était pas sauvé mais je ne savais pas trop comment y remédier.

    Merci beaucoup !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Richtextbox perte de mise en form dans email
    Par stephane eyskens dans le forum InfoPath
    Réponses: 4
    Dernier message: 04/05/2007, 23h59
  2. mise en forme automatique d'un richtextbox
    Par fabnet dans le forum Windows Forms
    Réponses: 2
    Dernier message: 29/03/2007, 15h52
  3. Réponses: 2
    Dernier message: 31/08/2006, 09h38
  4. [C#] Mise en forme RichTextBox
    Par Royd938 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 20/04/2006, 15h12
  5. Sauvegarder une mise en forme dans une RichTextBox
    Par jacma dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 29/12/2005, 12h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo