【问题标题】:.NET RichTextBox Text change from code not recording undo.NET RichTextBox 文本从代码更改不记录撤消
【发布时间】:2018-02-14 19:24:44
【问题描述】:

我在文本编辑器中使用RichTextBox 控件。我还有一个撤销功能。

当我更改 RichTextBox 中的文本并按撤消 (RichTextBox.Undo();) 时,一切都很好,它会按预期进行。
但是,当我使用 RichTextBox.Text = "somestring" 更改代码中的文本时,它不会记录用于撤消的内容。
有什么方法可以启用此功能,最好自己不跟踪任何更改? p>

【问题讨论】:

    标签: c# .net winforms richtextbox


    【解决方案1】:

    如果你想从代码中完全排除操作,我认为很难实现。而在您的示例代码中,如果我们将字符串文本粘贴到 RichTextBox 上,然后执行“Ctrl + Z”或撤消操作,您想要什么效果?所有的文字都消失了?因为如果这里没有代码操作,如果我们只是将一些字符串文本粘贴到一个普通的 RichTextBox 上,撤消操作将通过撤消粘贴操作来清除文本。如果你想要同样的效果,我想你可以使用下面的代码,或者假设你在这种情况下想要一些其他的效果,请把你的顾虑说清楚,我们仍然会尽力帮助。


        private void richTextBox1_KeyDown(object sender, KeyEventArgs e)
    
        {
    
            if (e.Control && (e.KeyCode == Keys.Z))
    
            {
    
                while (this.richTextBox1.CanUndo &&
    
                    this.richTextBox1.UndoActionName.Equals("Unknown"))
    
                {
    
                    this.richTextBox1.Undo();
    
                }
    
            }
    
            else if (e.Control && (e.KeyCode == Keys.V))
    
            {
    
                HighLightText();
    
                e.Handled = true;
    
            }
    
            else if (e.Shift && (e.KeyCode == Keys.Insert))
    
            {
    
                HighLightText();
    
                e.Handled = true;
    
            }  
    
        }
    
    
    
        private void HighLightText()
    
        {
    
            int iCount = 0;
    
            int iWordPos = 0;
    
            DataFormats.Format myFormat = DataFormats.GetFormat(DataFormats.Text);
    
            this.richTextBox1.Paste(myFormat);
    
            string[] strSplitText = this.richTextBox1.Text.Split(' ');
    
            foreach (string strWord in strSplitText)
    
            {
    
                if (iCount % 2 == 0)
    
                {
    
                    this.richTextBox1.Select(iWordPos, strWord.Length);
    
                    this.richTextBox1.SelectionColor = Color.Blue;
    
                }
    
                else
    
                {
    
                    this.richTextBox1.Select(iWordPos, strWord.Length);
    
                    this.richTextBox1.SelectionColor = Color.Black;
    
                }
    
                iWordPos += strWord.Length + 1;
    
                iCount++;
    
            }
    
            this.richTextBox1.Select(this.richTextBox1.Text.Length - 1, 0);
    
        }
    

    【讨论】:

      【解决方案2】:

      如果您使用SelectedText 属性,更改将被注册以进行撤消。

      所以而不是:

      RichTextBox.Text = "somestring"
      

      使用

          RichTextBox.SelectAll();
          RichTextBox.SelectedText = "something";
      

      【讨论】:

        猜你喜欢
        • 2010-09-21
        • 2011-03-19
        • 2016-02-29
        • 2010-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-29
        相关资源
        最近更新 更多