2016-08-02 67 views
-2

自動文本高亮顯示我非常非常新的C#,只是寫了一些計算器,文本編輯器和數據庫客戶端在學校近10年前:)不是我試圖做一個工具,我和我的同事們以更簡單的方式查看痕跡和日誌。我們所知的Notepad ++,我們每天使用文本突出顯示,樣式,但是關閉Notepad ++後,這些高亮會丟失。 因此,我現在的目標是製作相同的文本編輯器,但它可以保存您的工作。目前我正在研究該功能,因此當我選擇一些文本時,它將在整個文檔中搜索相同內容並突出顯示它,例如紅色背景。我添加了這一個: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; 

一類級別的變量,然後更改您的代碼:

而且,你正在編寫自己的文本編輯器?錯了,有可能一個簡單的解決方案:)

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); 
}