使用c#获取RichTextBox的最后输入的单词

时间:2013-08-19 18:24:21

标签: c# winforms richtextbox

如何在RichTextBox中获取最后输入的单词及其索引位置(两个空格之间的单词。一旦我按空格,我需要获取单词)。如果单词位于RichTextBox文档的末尾,我已使用以下代码获取最后输入的单词及其索引位置。

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的句子中间输入,我怎么得到最后输入的单词及其索引位置(例如' quick fox '是句子;如果我写'< em>在' fox '之后跳过'然后使用上面的代码我可以得到最后输入的单词。但是如果我将光标定位在' quick '之后在'快速'之后写' brown '如何在按空格键后立即获取最后输入的单词(即 brown )。

请帮忙

4 个答案:

答案 0 :(得分: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保存你单词的索引。

适用于各地的文字,但它有一个缺点:如果不是在“快速”之后插入插入符号而是输入“棕色空格”,用户将插入符号设置为“快速”并输入“SPACE brown”,这是不可能的目前正在检测它。

答案 1 :(得分: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];
        }
    }

我现在无法正确测试它,但它应该让你对如何做你想做的事情有一个很好的想法。

编辑:::对不起,试试这个

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

答案 2 :(得分: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. 按键响应
  3. 的SelectionChanged
  4. KEYUP

答案 3 :(得分: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());
    }