1

如何在 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 ' 是句子;如果我在' fox ' 之后写' jumps ',然后使用上面的代码我可以得到最后输入的单词但是如果我将光标定位在“快速”之后并在“快速”之后写下“棕色”,我如何在按下空格后立即获得最后输入的单词(即棕色)。

请帮忙

4

4 回答 4

6

好吧,搞砸我的第一个答案,那应该会更好:

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”,而是将插入符号放在“快速”并很好地键入“SPACE brown”,则无法检测到它目前。

于 2013-08-19T18:36:41.790 回答
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;
    }
于 2013-08-19T18:35:31.067 回答
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. 按键
  2. 按键
  3. 选择已更改
  4. 键升
于 2013-08-20T00:30:42.477 回答
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());
    }
于 2013-08-19T18:32:47.407 回答