2013-08-19 3 views
0

Как получить последнее введенное слово и его индексную позицию (слово между двумя пробелами, как только я нажму пробел, мне нужно получить слово) в RichTextBox. Я использовал следующий код для получения последнего введенного слова и его позиции индекса, если это слово находится в конце документа RichTextBox.Получить последнее введенное слово RichTextBox с помощью C#

private void richTextBox_KeyPress(object sender, KeyPressEventArgs e){ 
     if(e.KeyChar == ' '){ 
     int i = richTextBox.Text.TrimEnd().LastIndexOf(' '); 
     if(i != -1) MessageBox.Show(richTextBox.Text.Substring(i+1).TrimEnd()); 
       } 
     } 

Но как я могу получить последнее введенное слово и его индекс позицию, если я печатаю в середине предложений в RTB (например, «быстрого лисица» является предложение, если я пишу "прыжков «после» лисицы «то используя код выше, я могу получить последнее введенное слово. Но если я устанавливаю курсор после» быстрого «и написать» коричневый «после» быстро ', как я могу получить последнее введенное слово (т.е. brown) a скоро, когда я надаву на место.

Пожалуйста, помогите

+0

Возможный дубликат [Как извлечь последнее слово в richtextbox в C#] (http://stackoverflow.com/questions/12431607/how-to-extract-last-word-in-richtextbox-in-c-sharp) – gunr2171

+0

Позвольте мне видеть, что ссылка, если она работает в моей проблеме – jeff

ответ

0

Если вы ищете последнее введенное слово, а не только последнее слово в поле, вы будете нуждаться, чтобы создать набор слов в поле, а затем сравнить, что изменились, когда добавлены новые слова.

в непосредственной близости от верхней части моей головы

private string oldwords = ""; 
    private string newwords = ""; 
    private string lastword; 
    private int index; 

    private void richTextBox1_KeyPress(object sender, KeyPressEventArgs e) 
    { 
     if (e.KeyChar != ' ') return; 
     findLastword(); 
    } 

    private void findLastword() 
    { 
     newwords = richTextBox1.Text; 
     lastword = newwords.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries) 
          .Except(oldwords.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)) 
          .ToList().FirstOrDefault() ?? ""; 

     oldwords = newwords; 
     index = newwords.IndexOf(lastword.FirstOrDefault()); 
    } 
+0

Как мне получить положение индекса слова? – jeff

+0

см. Мое редактирование, но если вы знаете новое слово indexOf, чтобы найти его позицию в текстовом поле. Или есть причина, которая не сработает для вас? – trashrobber

1

Вы можете попробовать что-то вроде этого

RichTextBox richTextBox = new RichTextBox(); 
    string lastWord; 
    private void KeyPress(object sender, KeyPressEventArgs e) 
    { 
     if (e.KeyChar == ' ') 
     { 
      lastWord = richTextBox.Text.Split(' ')[richTextBox.Text.Split(' ').Count() - 2]; 
     } 
    } 

Я не могу точно проверить это прямо сейчас, но это должно дать вам представление о сильном как делать то, что вы хотите.

EDIT ::: К сожалению об этом, попробуйте это вместо

string lastword; 
    private void KeyPress(object sender, KeyPressEventArgs e) 
    { 
     if (e.KeyChar == ' ') 
     { 
      lastword = ReadBack(rtb.SelectionStart); 
     } 
    } 
    private string ReadBack(int start) 
    { 
     string builder = ""; 
     for (int x = start; x >= 0; x--) 
     { 
      Char c = rtb.Text[x]; 
      if (c == ' ') 
       break; 
      builder += c; 
     } 
     Array.Reverse(builder.ToArray()); 
     return builder; 
    } 
+0

Вы столкнулись с тем же вопросом, что и я. Это не последнее слово во всем тексте, но ему нужно последнее слово, которое было последним. Это означает, что если вы начнете печатать в середине строки, это будет видно, а не конец. Я предполагаю, что вам нужно что-то сделать с положением курсора, чтобы заставить это работать. – gunr2171

+0

вот что нужно здесь – jeff

+0

Да, это лучший ответ – jeff

5

Ладно винт мой первый ответ, который должен быть лучше:

private void richTextBox_KeyPress(object sender, KeyPressEventArgs e) 
{ 
    if (e.KeyChar == ' ') 
    { 
     int wordEndPosition = richTextBox1.SelectionStart; 
     int currentPosition = wordEndPosition; 

     while (currentPosition > 0 && richTextBox1.Text[currentPosition - 1] != ' ') 
     { 
      currentPosition--; 
     } 

     string word = richTextBox1.Text.Substring(currentPosition, wordEndPosition - currentPosition); 
    } 
} 

SelectionStart получает текущую позицию курсора. SelectionStart обычно используется, чтобы узнать, где начинается и заканчивается выбор текста пользователя («синий выделенный текст»). Однако, даже когда нет выбора, он все еще работает, чтобы получить текущую позицию каретки.

Затем, чтобы ввести введенное слово, оно идет назад, пока не найдет пробел (или индекс 0, для первого слова).

Итак, вы получите слово с небольшим Substring, а currentPosition содержит указатель вашего слова.

Работы для слов повсюду, но у него есть одна слабость: если вместо того, чтобы поместить каретку после «быстрого» и введя «коричневое пространство», пользователь помещает каретку в «быстрый» и набирает «КОСМОС коричневый» хорошо, это не можно обнаружить в настоящее время.

+0

Должен быть лучший способ. Есть ли способ получить текущую позицию курсора и начать перемещение влево до тех пор, пока не будет найдено пробел? – jeff

+0

@jeff Действительно, наконец-то выяснилось, как получить позицию каретки после небольшого исследования RichTextBox, прочитать мой обновленный ответ. –

+0

получил идею, я думаю, что смогу это сделать сейчас – jeff

1

Вы можете извлечь выгоду из некоторых Key событий и flags:

bool newStart; 
int startIndex; 
//SelectionChanged event handler for richTextBox1 
private void richTextBox1_SelectionChanged(object sender, EventArgs e) 
{ 
    //record the new SelectionStart 
    if (newStart) startIndex = richTextBox1.SelectionStart;       
} 
//KeyDown event handler for richTextBox1 
private void richTextBox1_KeyDown(object sender, KeyEventArgs e) 
{ 
    newStart = char.IsControl((char)e.KeyCode) || 
         ((int)e.KeyCode < 41 && (int)e.KeyCode > 36); 
} 
//KeyUp event handler for richTextBox1 
private void richTextBox1_KeyUp(object sender, KeyEventArgs e) 
{ 
    newStart = true;//This makes sure if we change the Selection by mouse 
    //the new SelectionStart will be recorded. 
} 
//KeyPress event handler for richTextBox1 
private void richTextBox1_KeyPress(object sender, KeyPressEventArgs e) 
{ 
    if (e.KeyChar == ' '){ 
     MessageBox.Show(richTextBox1.Text.Substring(startIndex, richTextBox1.SelectionStart - startIndex));   
     newStart = true; 
    }     
} 

Важно заметить здесь порядок событий:

  1. KeyDown
  2. KeyPress
  3. SelectionChanged
  4. KeyUp
Смежные вопросы