在RichTextBox_Click事件

时间:2015-11-22 21:55:36

标签: c# winforms click richtextbox

我正在使用包含RichTextBox的文本编辑器。我想要实现的功能之一是随时在TextBox中显示前面提到的RichTextBox的插入符号的当前行和列。

这是我使用的代码的一部分(我的其余代码与我的问题无关):

int selectionStart = richTextBox.SelectionStart;
int lineFromCharIndex = richTextBox.GetLineFromCharIndex(selectionStart);
int charIndexFromLine = richTextBox.GetFirstCharIndexFromLine(lineFromCharIndex);

currentLine = richTextBox.GetLineFromCharIndex(selectionStart) + 1;
currentCol = richTextBox.SelectionStart - charIndexFromLine + 1;

此时,我应该提一下,当有人使用RichTextBox时,插入符可以通过三种方式更改位置:

  • 更改Text
  • RichTextBox
  • 使用键盘上的箭头键
  • 点击RichTextBox
  • 上的任意位置

我在上面发布的代码在前两种情况下没有问题。但是,它在第​​三种情况下并没有真正起作用。

我尝试使用Click事件,我注意到selectionStart变量总是得到值0,这意味着我总是得到相同和错误的结果。此外,在MouseClickMouseUp等其他事件上使用相同的代码并未解决我的问题,因为selectionStart即使在这些事件的持续时间内也为0。

那么,每当用户点击RichTextBox时,如何获取当前的行和列?

2 个答案:

答案 0 :(得分:1)

你想要这样的东西:

private void richTextBox1_MouseUp(object sender, MouseEventArgs e)
{
        RichTextBox box = (RichTextBox)sender;
        Point mouseLocation = new Point(e.X, e.Y);
        box.SelectionStart = box.GetCharIndexFromPosition(mouseLocation);
        box.SelectionLength = 0;
        int selectionStart = richTextBox.SelectionStart;
        int lineFromCharIndex = box.GetLineFromCharIndex(selectionStart);
        int charIndexFromLine = box.GetFirstCharIndexFromLine(lineFromCharIndex);

        currentLine = box.GetLineFromCharIndex(selectionStart) + 1;
        currentCol = box.SelectionStart - charIndexFromLine + 1;
}

答案 1 :(得分:1)

在我看来,你真正想要的是处理TextBoxBase.SelectionChanged事件。然后导致选择更改的任何操作将调用您的代码,并且作为额外的好处,当您的事件处理程序被调用时,当前选择将被更新,并且您将确保获得正确的价值观。

如果这不符合您的具体需要,那么我一定不能理解这个问题。在这种情况下,请提供a good, minimal, complete code example,清楚地显示您正在尝试做的事情,准确描述该代码的作用以及与您希望的行为有何不同。