Comment souligner de manière sélective des chaînes dans RichTextBox?

Dans mon programme après avoir cliqué sur le bouton – les entrées sélectionnées de ListView doivent être copiées dans RichTextBox. ListView contient les informations de contact et l’effet que je souhaite obtenir est similaire à celui d’Oultook (lors de la sélection des contacts dans le carnet de contacts). Une partie de mon code qui sert à cela ressemble à ceci:

private void toButton_Click(object sender, EventArgs e) { int start = 0; for (int i = 0; i < contactsListView.SelectedItems.Count; i++) { if (contactsTextBox.TextLength != 0) contactsTextBox.Text += "; "; start = contactsTextBox.TextLength; contactsTextBox.Text += contactsListView.SelectedItems[i].Text + " " + contactsListView.SelectedItems[i].SubItems[1].Text + " [" + contactsListView.SelectedItems[i].SubItems[2].Text + "]"; contactsTextBox.Select(start, contactsTextBox.TextLength); contactsTextBox.SelectionFont = new Font(contactsTextBox.SelectionFont, FontStyle.Underline); contactsTextBox.DeselectAll(); contactsTextBox.SelectionFont = new Font(contactsTextBox.SelectionFont, FontStyle.Regular); } } 

Malheureusement, FontStyle est hérité de la totalité du texte et tout ce que j’entre après l’entrée dans ListView est également souligné.

Ma question est donc la suivante: comment souligner uniquement un texte (où j’ai commis une erreur)?

Il y a un sujet similaire sur stackoverflow ici malheureusement dans mon cas la solution a déclaré qu’il y aura un gaspillage de ressources.

Essayez ceci à la place:

  int start = 0; for (int i = 0; i < contactsListView.SelectedItems.Count; i++) { if (contactsTextBox.TextLength != 0) contactsTextBox.Text += "; "; start = contactsTextBox.TextLength; contactsTextBox.Text += contactsListView.SelectedItems[i].Text +" " + contactsListView.SelectedItems[i].SubItems[1].Text + " [" + contactsListView.SelectedItems[i].SubItems[2].Text + "]"; } this.contactsTextBox.Text += " "; this.contactsTextBox.SelectionStart = 0; this.contactsTextBox.SelectionLength = this.contactsTextBox.Text.Length-1; contactsTextBox.SelectionFont = new Font(contactsTextBox.SelectionFont, FontStyle.Underline); this.contactsTextBox.SelectionLength = 0; 

C'est du bidouillage total, mais si vous sélectionnez le texte après tout, mais ne sélectionnez pas TOUT (c'est pourquoi j'ajoute un "") supplémentaire, puis définissez le texte de sélection, l'effet recherché est obtenu.

Le problème avec votre code est que SelectionFont n’est que cela – la police de la sélection. S’il n’y a pas de sélection, le changement de police ne fera rien. La solution proposée par BFree semble fonctionner. C’est la même chose que si je tapais le document en WORD – j’appendais quelques caractères après la section soulignée avant que je ne le souligne, pour que les caractères supplémentaires “enregistrent” le formatage original du document.

+1 pour BFree, mais je n’ai pas encore de réputation 🙁 …

Avant d’append plus de texte à la fin de la zone de texte, positionnez le curseur à la fin et réglez la police sur le style souhaité. Ensuite, un appel à rtb.AppendLine () devrait produire les résultats souhaités.

Il est essentiel de se rappeler que le contrôle RTB fonctionne de la même manière que tout autre traitement de texte. Vous définissez un style et commencez à taper. Ensuite, tout ce que vous tapez après avoir défini ce style aura les atsortingbuts qui se trouvent sous le corsor.

Mise à jour: Cela semble fonctionner parfaitement.

 Dim tTexts() As Ssortingng = {"Dont underline me", "Underline me", "Dont underline me", "Underline me", "Dont underline me", "Underline me", "Dont underline me", "Underline me", "Dont underline me", "Underline me", "Dont underline me", "Underline me"} Dim tUnderline As Boolean = False Dim tIndex As Integer = 0 With oRTB For tIndex = tTexts.GetLowerBound(0) To tTexts.GetUpperBound(0) If tUnderline Then .SelectionStart = .Text.Length .SelectionFont = New Font("Arial", 12, FontStyle.Underline) Else .SelectionStart = .Text.Length .SelectionFont = New Font("Arial", 12, FontStyle.Regular) End If .AppendText(tTexts(tIndex)) tUnderline = Not tUnderline Next End With