1

我在从 Richtextbox 派生的控件中输入了以下文本

“世界是{美丽}”。

我的主要目的是为美丽这个词创建一个链接。我可以使用 CFE_LINK 创建它,但那是我选择文本的时候。

当我使用 Select (4,9) 时,4 到 9 范围内的文本被删除。

有人可以帮我解决我错过的问题吗?

代码 :

我正在创建一个从 Richtextbox 派生的用户控件。

我在下面给出了确切的代码;我没有做任何颜色更改。我认为 Select 命令默认将所选文本设置为蓝色。

protected override void OnKeyPress(KeyPressEventArgs e)
{
   String keypressed =  e.KeyChar.ToString();
   if(keypressed == "}")
      Select(4,9)        
   base.OnKeyPress(e);
}
4

4 回答 4

2

我怀疑按下“}”键时,您的代码会在字符发送到文本框之前运行。

因此,您选择文本,然后将“}”字符发送到文本框,覆盖所选内容。

编辑:是的,复制它。

我不确定如何解决它。也许实施起来会更好OnTextChanged。您可以扫描整个文本框以查找未链接的{大括号内的单词}。如果文本很大,它可能会更慢,但它会自动处理复制和粘贴之类的事情。

于 2009-05-21T13:18:13.743 回答
2

起初,当我开始搞砸这个时,我也很困惑。但是后来它击中了我,很有可能您按下的键被发送到文本框以在 KeyUp 处呈现。果然,当我将您的代码更改为此时,它起作用了:

    protected override void OnKeyUp(KeyEventArgs e)
    {
        base.OnKeyUp(e);
        if (e.KeyCode == Keys.Oem6)
        {
           Select(4, 9);
        }

    }
于 2009-05-21T13:26:34.413 回答
0

根据Blorgbeard的回答,您首先选择文本,然后在}文本框中输入“”,替换您的选择。也许您想要的是先键入“ }”,然后再进行选择。

protected override void OnKeyPress(KeyPressEventArgs e)
{
   // type "}" into textbox
   base.OnKeyPress(e);

   String keypressed =  e.KeyChar.ToString();

   if(keypressed == "}")
      Select(4,9)        
}
于 2009-05-21T13:45:19.477 回答
0

我投票支持 BFree 的答案,但是如果由于某种原因您必须使用 OnKeyPress 方法,您可以调用 select 方法,因此它会在事件完成后发生。

    protected delegate void SelectAfterKeyPress(int start, int length);

    protected override void OnKeyPress(KeyPressEventArgs e)
    {
        base.OnKeyPress(e);
        String keypressed = e.KeyChar.ToString();
        if (keypressed == "}")
        {
            this.BeginInvoke(new SelectAfterKeyPress(Select), new object[] { 4, 9 });
        }
    }
于 2009-05-21T13:37:35.140 回答