2016-08-02 8 views
-2

私は非常にC#で新しく、ほぼ10年前に電卓、テキストエディタ、DBクライアントを学校に書いています:)私は自分自身と私の同僚のツールを作ろうとしていませんトレースやログを簡単に表示することができます。私たちはメモ帳++を知っているだけで、毎日テキストのハイライト、スタイリングに使っていましたが、メモ帳++を閉じるとこれらのハイライトが失われることがあります。 私の目標は、同じテキストエディタを作成することですが、作業を保存できるようになります。現在、この機能を使用していますので、テキストを選択するときに、ドキュメント全体で同じものを検索し、強調表示します例えば、赤色の背景である。私はこれを追加しました:C#:リッチテキストの自動テキストハイライト

private void richTextBox1_SelectionChanged(object sender, EventArgs e) 
     { 
      int startIndex = 0; 

      while (startIndex<richTextBox1.TextLength) 
      { 
       int wordStartIndex = richTextBox1.Find(richTextBox1.SelectedText, startIndex, RichTextBoxFinds.None); 
       if (wordStartIndex != -1) 
       { 
        richTextBox1.SelectionStart = wordStartIndex; 
        richTextBox1.SelectionLength = richTextBox1.SelectionLength; 
        richTextBox1.SelectionBackColor = Color.Red; 
       } 
       else 
        break; 
       startIndex += wordStartIndex + richTextBox1.SelectionLength; 
      } 


     } 

しかし、私はここにループがあるので、私に "StackOverFlow"を与えます。あなたはそれを私に助けてくれますか? ループバックを避けるために2回の検索を実行する必要があると思います。それとももっと簡単なオプションがありますか?

ありがとう、皆さん!

答えて

0

選択変更を確認するイベントが発生しているため、無限ループが発生しています。このイベントでは、選択を変更するとイベントが発生し、選択を変更します。また、

:イベントは、あなたがこれを避けたい場合は

あなたは

bool inSelectionChangeEvent; 

のようなクラスレベルの変数を必要とし、その後にコードを変更します...原因自分のOWNテキストエディタを書いていますか?エラーがあります。がより簡単な解決策になります。

0

問題は選択の長さです。右ここに:

richTextBox1.SelectionLength = richTextBox1.SelectionLength; 

それは自分自身に同じものを設定するためには良いもしませんし、私は、これは事故だった推測しています。 SelectionLengthが0の場合、startIndexは決して増加しません(何も+ 0は何もありません)。

最初に行うことは、richTextBox1.SelectionLength < 1であるかどうかをチェックしている場合は、何もせずにメソッドから戻ってください。

MSDNからこのコードスニペットを助けるべきであるあなたがやっていることを達成:

string wordToFind = "melp"; 
int index = richTextBox1.Text.IndexOf(wordToFind); 
while(index != -1) 
{ 
    richTextBox1.Select(index, wordToFind.Length); 
    richTextBox1.SelectionColor = Color.Red; 

    index = richTextBox1.Text.IndexOf(wordToFind, index + wordToFind.Length); 
}