【问题标题】:Get last entered word of RichTextBox using c#使用 c# 获取 RichTextBox 的最后输入的单词
【发布时间】:2014-06-19 16:51:57
【问题描述】:

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

请帮忙

【问题讨论】:

标签: c# winforms richtextbox


【解决方案1】:

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

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”,这是不可能的当前检测它。

【讨论】:

  • 必须有更好的方法。有没有办法获取当前光标位置并开始向左遍历直到找到一个空格?
  • @jeff 确实,在对 RichTextBox 进行了一些研究之后,终于找到了如何获得插入符号的位置,阅读我更新的答案。
  • 明白了,我想我现在可以做到了
【解决方案2】:

你可以试试这样的

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

【讨论】:

  • 你遇到了和我一样的问题。这不是整个文本中的最后一个单词,但他需要最后输入的最后一个单词。这意味着如果您开始在字符串的中间输入,它会从那里开始,而不是结尾。我假设你必须对光标的位置做一些事情才能让它工作。
  • 正是这里所需要的
  • 是的,这是一个更好的答案
【解决方案3】:

您可以从一些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. KeyUp

【讨论】:

    【解决方案4】:

    如果您要查找最后输入的单词,而不仅仅是框中的最后一个单词,您将需要在框中创建一个单词集合,然后比较添加新单词时发生的变化。

    就在我的头顶

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

    【讨论】:

    • 那么如何获取单词的索引位置呢?
    • 查看我的编辑——但如果你知道新词 indexOf 来找到它在文本框中的位置。还是有什么不适合你的原因?
    猜你喜欢
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多