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)
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. –
La valeur ne peut pas être nulle. Nom du paramètre: position2 à System.Windows.Documents.TextRange..ctor (TextPointer position1, TextPointer position2) – Karan
É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. –