2017-09-07 3 views
1

Dans un contrôle RichTextBox, j'essaie de mettre en évidence un texte spécifique en couleur ROUGE résultant d'un match Regex.Comment mettre en surbrillance un texte spécifique dans un RichTextBox?

Exemple:

Cette déclaration de texte fonctionne très bien et met en évidence la 'doyens' à l'ombre rouge:

sélectionner top 10 * du client où mailname = 'doyens'

Cette déclaration de texte fonctionne très bien aussi et met en évidence le code dans la teinte rouge:

select top 10 * du client où mailname = 'De a ns'

Mais cette déclaration échoue:

sélectionner top 10 * du client où mailname = 'doyens'

Il échoue parce que il y a de l'espace entre les guillemets simples, il jette une exception sur la ligne faisant le début TextRange à

TextRange result = new TextRange(start, start.GetPositionAtOffset(word.Length)); 

L'exception dit:

position de paramètre non valide 2.

S'il vous plaît me suggérer une solution. Où est-ce que je fais une erreur?

Voici l'extrait de code:

string StringFromRichTextBox(RichTextBox rtb) 
{ 
    TextRange textRange = new TextRange(rtb.Document.ContentStart,  
       rtb.Document.ContentEnd); 

    return textRange.Text; 
} 

private void TextChangedEventHandler(object sender, TextChangedEventArgs e) 
{ 
    TextRange documentRange = new TextRange(txtQueries.Document.ContentStart, txtQueries.Document.ContentEnd); 
     documentRange.ClearAllProperties(); 

    MatchCollection match = Regex.Matches(StringFromRichTextBox(txtQueries), @"'([^']*)'"); 
    for (int z = 0; z < match.Count; z++) 
    { 
     CheckKeyword(documentRange, match[z].ToString().Trim()); 
    } 
} 

private void CheckKeyword(TextRange textRange, string word) 
{ 
    //txtQueries.TextChanged -= this.TextChangedEventHandler; 
    if (textRange.Text.Contains(word)) 
    { 
     int offset = textRange.Text.IndexOf(word); 
     if (offset < 0) 
     { 
      return; 
     }// Not found 
     else 
     { 
      // Try to select the text as a contiguous range 
      for (TextPointer start = textRange.Start.GetPositionAtOffset(offset); start != textRange.End; start = start.GetPositionAtOffset(1)) 
      { 
       try 
       { 
        TextRange result = new TextRange(start, start.GetPositionAtOffset(word.Length)); 
        if (result != null && result.Text == word) 
        { 
         result.ApplyPropertyValue(TextElement.ForegroundProperty, new SolidColorBrush(Colors.Red)); 
         break; 
        } 
       } 
       catch(Exception ex) 
       { 
        throw new Exception(ex.Message); 
       } 
      } 
     } 
    } 
    //txtQueries.TextChanged += this.TextChangedEventHandler; 
} 

Message d'erreur:

valeur ne peut pas être nulle. Nom du paramètre: Position2 à System.Windows.Documents.TextRange..ctor (TextPointer position1, TextPointer Position2)

+0

Quelle ligne de code lançant l'exception? Veuillez également envoyer un message d'exception exact que vous obtenez pour une compréhension rapide du problème. –

+0

La valeur ne peut pas être nulle. Nom du paramètre: position2 à System.Windows.Documents.TextRange..ctor (TextPointer position1, TextPointer position2) – Karan

+0

Étant donné que le problème est clair à partir de l'exception, avez-vous essayé de déboguer avec un point d'arrêt quelle valeur est passée à 'position2' dans votre code ? Je suppose que la ligne: 'TextRange result = new TextRange (start, start.GetPositionAtOffset (word.Length));' pourrait être le coupable. –

Répondre

0

Résolution :: 4 Ajouté à la longueur de décalage pour tenir compte des caractères invisibles spéciaux à venir avec espace richtextbox.

var length = word.Length; 
       // Try to select the text as a contiguous range 
       for (TextPointer start = textRange.Start.GetPositionAtOffset(offset); start != textRange.End; start = start.GetPositionAtOffset(1)) 
       { 
        try 
        { 

         TextRange result = new TextRange(start, start.GetPositionAtOffset(word.Contains(" ") ? word.Length + 4: word.Length)); //Added 4 to the offset length to account for special invisible characters coming up with space in richtext box 
         if (result.Text.Trim() == word.Trim()) 
         { 
          result.ApplyPropertyValue(TextElement.ForegroundProperty, new SolidColorBrush(Colors.Red)); 
          break; 
         } 

        } 
        catch (Exception ex) 
        { 
         throw new Exception(ex.Message); 
        }