如何在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 )。
请帮忙
答案 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;
}
}
这里需要注意的重要事项是事件的顺序:
答案 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());
}