supprimer les lignes RichTextBox tout en conservant la couleur des lignes restantes en C #

Considérons une RichTextBox qui a 400 lignes et comprend un certain nombre de mots et des lignes de couleurs différentes.

Est-il possible de supprimer les 100 premières lignes de cette zone de texte, tout en réservant la couleur des mots restants? Actuellement, j’utilise le code ci-dessous pour supprimer des lignes, mais il ne parvient pas à conserver les couleurs.

if (rtb.Lines.Count() > 400) rtb.Lines = rtb.Lines.Skip(100).ToArray(); 

Utilisez la propriété SelectionText. Commencez par sélectionner les lignes à supprimer, puis supprimez-les en définissant SelectionText sur une chaîne vide. Comme ça:

  richTextBox1.SelectionStart = 0; richTextBox1.SelectionLength = richTextBox1.GetFirstCharIndexFromLine(200); richTextBox1.SelectedText = ""; 

Cela préserve le formatage de toutes les autres lignes. Cela peut provoquer un scintillement visible sur l’interface utilisateur. Vous pouvez le supprimer en implémentant les méthodes Begin / EndUpdate comme indiqué ici .

Vous ne pouvez pas utiliser la propriété Lines si vous souhaitez conserver la mise en forme. Lines est dérivé de TextBoxBase. Vous devez utiliser la propriété Rtf et parsingr les lignes vous-même dans la chaîne que vous récupérez. Si vous voulez juste obtenir le nombre de lignes puis parsingr le format RTF, vous pouvez faire quelque chose comme:

 // NOTE: I am using Length rather than Count() because the array already knows its length if (rtb.Lines.Length > 400) { // Parse the rtf here to remove the unwanted lines and preserve the format } 

Il vous faudrait examiner les spécifications RTF pour extraire avec précision les lignes réelles. Un saut de ligne est indiqué par le tag \par . La ligne qui serait délicate à traiter est la première ligne car elle peut contenir des informations supplémentaires avant le texte de la première ligne.

.SelectedText = “” jette un ding Windows dans mon application

J’ai donc trouvé une deuxième solution qui consiste à jouer avec la propriété .Lines

 if (nbLines > maxLines) { Array.Copy(rtfBox.Lines, 1, rtfBox.Lines, 0, rtfBox.Lines.Length - 1); }