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

C# 使用c获取RichTextBox最后输入的单词#,c#,winforms,richtextbox,C#,Winforms,Richtextbox,如何在RichTextBox中获取最后输入的单词及其索引位置(单词位于两个空格之间。我一按空格就需要获取单词)。我使用以下代码获取最后输入的单词及其索引位置(如果单词位于RichTextBox文档的末尾) private void richTextBox_KeyPress(object sender, KeyPressEventArgs e){ if(e.KeyChar == ' '){ int i = richTextBox.Text.TrimEnd().L

如何在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”,那么使用上述代码我可以得到最后输入的单词。但是如果我将光标定位在“quick”之后,并在“quick”之后写“brown”,我如何在按下空格键后得到最后输入的单词(即brown)


请提供帮助

如果要查找最后输入的单词,而不仅仅是框中的最后一个单词,则需要在框中创建一组单词,然后比较添加新词时发生的更改

就在我头上

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

你可以试试这样的

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

好吧,我的第一个答案应该更好:

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,第一个单词)

因此,您只需使用一点
子字符串
,即可获得单词,
currentPosition
保存单词的索引


适用于任何地方的单词,但它有一个缺点:如果用户没有将插入符号放在“quick”之后并输入“brown SPACE”,而是将插入符号放在“quick”并键入“SPACE brown”,那么当前无法检测到它。

您可以从一些
事件和
标志中获益:

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;
   }                   
}
boolnewstart;
国际标准指数;
//SelectionChanged richTextBox1的事件处理程序
private void richTextBox1_SelectionChanged(对象发送方,事件参数e)
{
//记录新的选择开始
如果(newStart)startIndex=richTextBox1.SelectionStart;
}
//richTextBox1的KeyDown事件处理程序
私有void richTextBox1_KeyDown(对象发送方,KeyEventArgs e)
{
newStart=char.IsControl((char)e.KeyCode)||
((int)e.KeyCode<41&(int)e.KeyCode>36);
}
//richTextBox1的KeyUp事件处理程序
私有void richTextBox1_KeyUp(对象发送方,KeyEventArgs e)
{
newStart=true;//这确保我们是否通过鼠标更改选择
//将记录新的选择开始。
}
//richTextBox1的按键事件处理程序
private void richTextBox1_按键(对象发送器,按键事件参数e)
{
如果(e.KeyChar==''){
Show(richTextBox1.Text.Substring(startIndex,richTextBox1.SelectionStart-startIndex));
newStart=true;
}                   
}
这里需要注意的重要事项是事件的顺序:

  • 键控
  • 按键
  • 选择已更改
  • 钥匙

  • 必须有更好的方法。有没有办法获取当前光标位置并开始向左移动直到找到一个空格?@jeff确实,在对RichTextBox进行了一点研究后,终于找到了如何获取插入符号位置,请阅读我的最新答案。有了这个想法,我想我现在可以做到了。我该如何获取单词的索引位置?参见我的编辑——但是如果你知道新单词“索引”在文本框中找到它的位置。或者有一个原因对你不起作用吗?你碰到了我所做的同一个问题。它不是整个文本中的最后一个单词,但是他需要最后一个字。这意味着,如果你开始在字符串中间打字,它会在那里捡起,而不是。结束。我想你必须对光标的位置做些什么才能让它工作。这正是这里需要的。是的,这是一个更好的答案。如果它在我的问题中起作用,请让我看看这个链接