Как выделить c слово в richtextbox во время записи? - PullRequest
0 голосов
/ 21 марта 2020

В основном я хочу сделать автозамену для моего языка. У меня есть RichTextBox (имя: MainText), где я пишу. во время записи программа должна каждое слово, если оно существует в файле словаря. если нет, тогда измените цвет c на красный. У него есть таймер. через каждую секунду он получает записанный текст и помещает слова в массив str, читает правильные слова из файла dictionary.txt и помещает их в список. при сравнении строк он никогда не выделяет неправильные слова и всегда имеет ошибки indexOutOfRange. Как это исправить?

Вот отметка таймера void:

void CheckTimer_Tick(object sender, EventArgs e)
    {
        List<string> correct_words = File.ReadAllLines(DictPath).ToList();
        string text = MainText.Text;
        string[] Words = text.Split(' ', '.');

        for (int i = 0; i < Words.Length; i++)
        {
            if (correct_words.Contains(Words[i])) { }
            else
            {
                int index = 0;
                String temp = MainText.Text;
                MainText.Text = "";
                MainText.Text = temp;

                while (index < MainText.Text.LastIndexOf(Words[i]))
                {
                    MainText.Find(Words[i], index, MainText.TextLength, RichTextBoxFinds.None);
                    MainText.SelectionColor = Color.Red;
                    index = MainText.Text.IndexOf(Words[i], index) + 1;
                }

            }
        }

    }

Я также пробовал эту пустоту:

void HighlightPhrase(RichTextBox box, string phrase, Color color)
    {
        int pos = box.SelectionStart;
        string s = box.Text;

        for (int ix = 0; ;)
        {
            int jx = s.IndexOf(phrase, ix, StringComparison.CurrentCultureIgnoreCase);
            if (jx < 0) break;
            box.SelectionStart = jx;
            box.SelectionLength = phrase.Length;
            box.SelectionColor = color;
            ix = jx + 1;
        }
        box.SelectionStart = pos;
        box.SelectionLength = 0;
        box.ForeColor = Color.Black;
    }

Это сработало, если я дал ему конкретную c строку, но он не смог распознать ввод слов из словаря и выдал ошибку indexOutOfRange.

Ответы [ 2 ]

1 голос
/ 22 марта 2020
     public Form1()    
     {    
          InitializeComponent();    
      }    

      private void textbox1_TextChanging(object sender, EventArgs e)    
      {    
         string[] words = textBox1.Text.Split(',');    
         foreach(string word in words)    
         {    
             int startindex = 0;    
             while(startindex < richTextBox1.TextLength)    
             {    
                 int wordstartIndex = richTextBox1.Find(word, startindex, RichTextBoxFinds.None);    
                 if (wordstartIndex != -1)    
                 {    
                     richTextBox1.SelectionStart = wordstartIndex;    
                     richTextBox1.SelectionLength = word.Length;    
                     richTextBox1.SelectionBackColor = Color.Yellow;    
                 }    
                 else    
                     break;    
                 startindex += wordstartIndex + word.Length;    
             }    
         }    
     }          
0 голосов
/ 22 марта 2020

Для Clear Hightlight Используйте этот код

         richTextBox1.SelectionStart = 0;    
         richTextBox1.SelectAll();    
         richTextBox1.SelectionBackColor = Color.White;    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...