2010-10-18 2 views
1

J'ai un contrôle RichTextBox sur mon formulaire. Le contrôle est configuré de telle manière qu'il s'enroulera à la ligne suivante après l'entrée de 32 lignes de texte. Le problème que je rencontre est que je veux être capable de récupérer un tableau de chaînes représentant les lignes de mon contrôle. Je sais qu'il existe une propriété Lines attachée à la RichTextBox, mais je rencontre 2 problèmes avec elle:Récupération d'un tableau de chaînes précis à partir d'un contrôle RichTextBox

1) Je veux seulement un tableau de chaînes montrant les lignes qui sont visibles sur l'écran seulement. À l'heure actuelle, le tableau Lignes renvoie toutes les lignes de la zone RichTextBox. Je ne veux que les lignes visibles sur l'écran retourné.

2) La propriété Lines ne me donne pas une représentation fidèle de mes lignes. Il compte une "ligne" comme une ligne de texte terminée par un retour chariot ou \ n. Donc en d'autres termes, si je tape 64 caractères et qu'aucun d'entre eux n'est un retour chariot, alors il devrait retourner 2 lignes (car il y a 32 caractères par ligne). Au lieu de cela, il ne retourne aucune ligne avant que j'appuie sur Entrée. Même alors, il ne renvoie qu'une ligne, et non deux. Il agit plus comme une propriété Paragraphe, s'il y avait une telle chose.

Quelqu'un connait un moyen de contourner ces 2 questions? J'utilise C# BTW

+0

Cul opposé à ... un tableau inexact? –

+0

@Ed: Eh bien, si vous voulez être philosophique à ce sujet, je suppose que ce n'est pas le tableau en soi, c'est inexact. Ce sont les chaînes dans le tableau qui sont inexactes. – Icemanind

Répondre

1

Vous devez faire quelques astuces pour obtenir ce qui a à voir avec l'interrogation pour la position des lignes réelles selon l'indice de caractère . Le programme suivant montre une façon de le faire. Vous devrez peut-être le durcir un peu, mais il devrait vous aider à démarrer:

public partial class Form1 : Form 
{   
    public Form1() 
    { 
     InitializeComponent();       
    }   

    private void richTextBox1_TextChanged(object sender, EventArgs e) 
    { 
     if (richTextBox1.Text == "") 
      return; 

     // Lines corresponding to the first and last characters: 
     int firstLine = richTextBox1.GetLineFromCharIndex(0); 
     int lastLine = richTextBox1.GetLineFromCharIndex(richTextBox1.Text.Length); 

     // Get array of lines: 
     List<string> lines = new List<string>(); 
     for (int i = firstLine; i <= lastLine; i++) 
     { 
      int firstIndexFromLine = richTextBox1.GetFirstCharIndexFromLine(i); 
      int firstIndexFromNextLine = richTextBox1.GetFirstCharIndexFromLine(i + 1); 

      if (firstIndexFromNextLine == -1) 
      { 
       // Get character index of last character in this line: 
       Point pt = new Point(richTextBox1.ClientRectangle.Width, richTextBox1.GetPositionFromCharIndex(firstIndexFromLine).Y); 
       firstIndexFromNextLine = richTextBox1.GetCharIndexFromPosition(pt); 
       firstIndexFromNextLine += 1; 
      } 

      lines.Add(richTextBox1.Text.Substring(firstIndexFromLine, firstIndexFromNextLine - firstIndexFromLine)); 
     } 

     // Print to richTextBox2 while debugging: 
     richTextBox2.Text = ""; 
     foreach (string line in lines) 
     { 
      richTextBox2.AppendText(">> " + line + Environment.NewLine); 
     }       
    } 
} 
+0

Cela semble fonctionner. Il y a quelques bogues de wierd quand le richtextbox défile, mais je pense que je peux le réparer. Merci pour l'aide! – Icemanind

Questions connexes