2009-06-26 5 views
2

J'utilise le contrôle System.Windows.Forms.RichTextBox dans .NET 2.0 et j'utilise C#.Comment pouvez-vous ajouter une ligne , pas un par un System.Windows.Forms.RichTextBox

J'ai un tableau de chaînes que je voudrais ajouter à la RichTextBox, mais je ne veux pas créer de nouveaux paragraphes dans le RTF. Je veux que les lignes soient divisées par les commandes \ line, pas par \ dans le RTF. (Je veux simuler quelqu'un en tapant Maj + Entrée au lieu de simplement entrer.)

Je n'ai pas réussi à obtenir RichTextBox.AppendText pour générer une commande \ line au lieu d'une commande \ par. J'ai donc inséré mon texte puis inséré manuellement la commande \ line dans le fichier RTF lui-même.

Cela échoue lorsque l'une des chaînes contient des caractères qui sont échappés dans le RTF (un seul closequote est converti en \ rquote par exemple) parce que je ne trouve pas la chaîne d'origine insérée dans le RTF.

Avec cette solution, j'aurai besoin d'échapper les caractères de ma ligne avant de la chercher dans le RTF.

Existe-t-il un moyen pour que le contrôle RichTextBox génère la commande \ line et non la commande \ par ou devrais-je coller avec cette solution et rechercher la chaîne d'échappement RTF.

Voici mon code actuel:

string[] lines = textInfo.Lines; 

for (int i = 0; i < lines.Length; i++) 
{ 
    rtb.AppendText(lines[i]); 

    if (i < lines.Length - 1) 
    { 
     string rtf = rtb.Rtf; 

     int insertedIndex = rtf.LastIndexOf(lines[i]); 

     int length = lines[i].Length; 

     rtf = rtf.Insert(insertedIndex + length, @"\line"); 

     rtb.Rtf = rtf; 
    } 
} 

Répondre

1

Le contrôle RichTextBox met à jour automatiquement le texte et les propriétés Rtf lorsque vous modifiez l'un d'eux. Tout texte ajouté à la propriété Text sera automatiquement mis à jour vers la propriété RTF. À partir de quelques tests rapides, il semble que le contrôle RichTextBox insère automatiquement \ par à toute nouvelle ligne (entrée, shift-enter sur le contrôle et \ r \ n \ r \ n Environment.NewLine sur la propriété Text et l'AppendText () fonctionnent sur le contrôle lui-même). Quel est ce que vous signalez comme votre problème.

Je ne crois pas qu'il existe un moyen de changer la façon dont le contrôle génère RTF. Je voudrais juste ajouter le texte et laisser le contrôle RichTextBox gérer la conversion de tous les caractères qui peuvent avoir besoin d'échapper puis remplacer tous les \ par avec \ line.

Supposant TextInfo est une zone de texte et que vous voulez ajouter son contenu à la fin de certains RTF déjà existant (si pas remplacer + = pour = dans la ligne 1

rtb.Text += textInfo.Text; 

rtb.Rtf = rtb.Rtf.Replace(@"\par", @"\line"); 

Edit:

Puisque vous 'ajoute des lignes à votre document ligne par ligne, et vous savez que le contrôle génère un \ par pour \ r \ n, vous pouvez postfixer du texte unique (vous pouvez être créatif ici, j'ai utilisé REPLN) sur les lignes que vous voulez casser Avec une ligne, il va de soi que vous deviez être capable d'identifier les lignes que vous voulez remplacer, ce que je suppose que vous faites à partir de votre question. peut alors remplacer à nouveau REPLN \ par avec \ line. Pas aussi élégant que je l'aurais souhaité, mais il fait le travail.

foreach (string line in textInfo.Lines) 
{ 
    //assuming your condition is that the string contains the substring, "substring" 
    rtb.AppendText(line + (line.Contains("substring") ? "REPLN\r\n" : "\r\n")); 
} 

rtb.Rtf = richTextBox1.Rtf.Replace(@"REPLN\par", @"\line"); 
+0

Cela a été ma découverte aussi. Je ne veux pas remplacer toutes les instances \ par par des instances \ line dans le RTF, donc je pense que je vais devoir continuer à utiliser ma solution à moins que je trouve quelque chose de mieux. – jameswelle

+0

Je suppose que vous avez raison, cela tuerait tous les paragraphes de votre document. À moins que vous ne trouviez un moyen de modifier de manière sélective la façon dont le contrôle RichTextBox effectue des sauts de ligne, il est temps de hack! Modifier la réponse ... – Luis

Questions connexes