2017-04-25 1 views
1

ユーザーは、次の規則に従って、色分けされたテキストを入力することができるRichTextBoxを持っています。RichTextBoxのテキストを効率的に色分けする

  1. { } () | . (dot)これらの文字は赤色である必要があります。
  2. [A-Z] [a-z] [0-9]アンダースコアとハイフンこれらは暗い灰色でなければなりません。
  3. 他はすべて青色である必要があります。

今のところ、このコードはボックスの内容が変更されたときに表示されます。 このメソッドは、テキストボックスの内容に変更が検出されたときに呼び出されます。

これは数百の文字がある場合、非常に遅くなることがわかります。この状況を改善するにはどうすればいいですか?

+0

変更するたびに実行する代わりに、更新プログラムをキューに入れようとする場合があります。[this](http://stackoverflow.com/q/15587767/1997232)を参照してください。 – Sinatr

+0

@Sinatrもっと精巧な答えが大いに評価されるだろう。 –

+1

[AvalonEdit](http://avalonedit.net)のような構文の強調表示をサポートするエディタを使用することもできます。 [documentation](http://avalonedit.net/documentation/)内には、[独自のルールの定義方法]があります(http://avalonedit.net/documentation/html/4d4ceb51-154d-43f0-b876-ad9640c5d2d8 .htm)。 – Oliver

答えて

0

あなたはおそらくKeyUpイベントでそれを行うことができるので、変更された単一の文字だけが表示されます。これがもっと速いのかどうかは分かりません。

private void rtb_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e) 
{ 

    if (e.KeyCode == Keys.OemPeriod 
     rtb.SelectionColor = Color.Red; 
    ... 
    } 
} 
+0

違反はありませんが、これはコメントではありません。私はそうではありませんが、誰かがこの回答に投票できます。今、あなたの解決策について、どのように変化が起こったのか正確に知ることができます。既にテキストボックスに入っているコンテンツの間にある可能性があります。 –

+0

変更がどこで起こったのか、あなたの質問が分かりません。 KeyUpイベントには、どのキーが押されたかを示すイベントargがあります。そのため、以前に入力したすべてのテキストをループする代わりに、どの文字を1文字にするべきかを評価できます。 https://msdn.microsoft.com/en-us/library/system.windows.forms.control.keyup(v=vs.110).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet -2 –

+0

これは、 'abcdef ..(' 'ユーザが' c 'の文字の隣にカーソルを置いて '{'を押すと、今はどのキーが押されていたのか知​​っていません文字列内のどの位置にあるのか –

関連する問題