【问题标题】:Selecting text in RichTexbox in C# deletes the text在 C# 中选择 RichTextbox 中的文本会删除文本
【发布时间】:2009-05-21 21:45:19
【问题描述】:

我在从 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);
}

【问题讨论】:

  • 您使用的是 WinForms 还是 WPF?
  • 这里的代码 sn-p 会很有帮助。
  • 另外,请注意发布一些代码,以便我们准确了解您在做什么。
  • 无法复制;文本被选中(但请注意,除非 rtf 是活动控件,否则它可能不会显示)
  • 您的突出显示颜色是否与文本颜色相同?这会使文本看起来不存在,尽管它仍然存在。

标签: c# richtextbox


【解决方案1】:

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

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

    }

【讨论】:

  • 这看起来不错。其实我要感谢大家的意见。知道如何获取我输入的字符的索引。比 GetPositionFromCharIndex 更好的选择;在这种情况下,我可以有很多 { } 并且需要为所有这些维护一个列表。
【解决方案2】:

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

所以你选择文本,然后'}'字符被发送到文本框,覆盖选择。

编辑:是的,复制了它。

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

【讨论】:

    【解决方案3】:

    我投票给了 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 });
            }
        }
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-10
        • 1970-01-01
        • 2012-02-13
        • 1970-01-01
        • 2014-11-02
        • 1970-01-01
        相关资源
        最近更新 更多