6

RichTextBoxで強調表示する必要のあるオフセットの大きなリストがあります。ただし、このプロセスには時間がかかりすぎます。私は次のコードを使用しています:

foreach (int offset in offsets)
{
    richTextBox.Select(offset, searchString.Length);
    richTextBox.SelectionBackColor = Color.Yellow;
}

これを行うためのより効率的な方法はありますか?

アップデート:

この方法を使用してみましたが、何も強調表示されていません。

richTextBox.SelectionBackColor = Color.Yellow;
foreach (int offset in offsets)
{
    richTextBox.Select(offset, searchString.Length);
}
4

3 に答える 3

1

私は以前にこの同じ問題を抱えていました。彼らが提供するすべてのメソッドを無視して、基礎となる RTF データを操作することになりました。また、コードの 2 番目のブロックが機能しない理由は、RTF が書式設定をそのまま適用するため、関数 (この場合はプロパティ) を呼び出して選択色を変更すると、現在選択されているブロックにのみ適用されます。 . その呼び出しの後に選択に加えられた変更は、無関係になります。

RGB 値をいじることができます。または、RTF コントロール内でさまざまなことを行う方法についての優れたソースがここにあります。この関数をコードに追加して、どのように機能するかを確認してください。これを使用して、SQL コードのリアルタイムの構文強調表示を提供します。

    public void HighlightText(int offset, int length)
    {
        String sText = richTextBox.Text.Trim();
        sText = sText.Insert(offset + length - 1, @" \highlight0");
        sText = sText.Insert(offset, @" \highlight1");
        String s = @"{\rtf1\ansi\deff0{\fonttbl{\f0\fnil\fcharset0 Courier New;}}
            {\colortbl ;\red255\green255\blue0;}\viewkind4\uc1\pard";
        s += sText;
        s += @"\par}";
        richTextBox.Rtf = s;
    }
于 2012-05-31T17:38:02.750 に答える
1

あなたの問題をグーグルで調べたところ、行数が多いと RichTextBox が非常に遅くなることがわかりました。
私の意見では、パフォーマンスに満足できるサード パーツ コントロールを購入するか、選択タスク全体を分割するスレッドが必要になるかのいずれかです。彼らは物事を加速できると思います。
それが役に立てば幸い !

于 2012-05-30T21:47:30.513 に答える
0

ループの外で SelectionBackColor を設定すると違いはありますか?

Reflector を使用して RichTextBox を調べると、色が設定されるたびに WindowMessage がコントロールに送信されることがわかります。オフセットの数が多い場合、既に強調表示されている単語が何度も強調表示され、O(n^2) の動作が発生する可能性があります。

于 2012-05-29T20:34:50.540 に答える