0

我正在用 C# 开发一个小型 Windows 窗体应用程序。我有很多按钮和一个组合框,点击后可以在富文本框中的当前光标位置添加某些文本。有没有办法撤消这个文本插入?我已经尝试过richTextBox.Undo() 方法,但它只有在添加到富文本框中的最新文本是通过键盘时才有效。但如果是通过按钮或组合框,则什么也不会发生,而且光标也会消失。这是我在单击按钮时添加文本的方法,我希望在单击撤消按钮或 CTRL+Z 时撤消它

    private void mybuttonclick(object sender, EventArgs e) 
    {
        // ---------- Method for inserting tags on clicking the POS Tags buttons ---------- //

        Button btn = (Button)sender; // receiving information about which button was clicked.
        string strInsert = "<" + btn.Text + ">" + " "; // inseting '<>' and an extra space at the end of the tag

        // inserting the tag at the current cursor position.

        richTextBox1.Focus();
        int i = richTextBox1.SelectionStart;
        richTextBox1.Text = richTextBox1.Text.Insert(richTextBox1.SelectionStart, strInsert);
        richTextBox1.SelectionStart = i + strInsert.Length;

        // moving the cursor to the next word to be tagged.

        richTextBox1.Focus();
        SendKeys.SendWait("^{LEFT}");
    }

需要帮助。

问候!

4

4 回答 4

1

The Code Project 上有几个“撤消管理器”可用,例如这里有一个带有文本框的示例:

在此处输入图像描述

如果我必须解决它,我会下载该示例并查看如何调整它以适应我自己的要求。

于 2012-07-17T15:11:45.427 回答
1

是的,您可以创建一个 List<string> 这样列表将跟踪插入并回滚以撤消。

于 2012-07-17T15:09:01.213 回答
0

撤消/重做并不容易。有许多不同的方法,但通常,它们都归结为一个堆栈,用于跟踪用户执行的操作。要撤消,您弹出最近的操作,并执行一些方法来撤消该操作。

在文本的情况下,我会做这样的事情:

  1. 首先记录框中的文本。
  2. 在按键时,启动/重置计时器(例如 0.5 秒)。
  3. 当计时器到期(用户暂停输入)时,将旧文本存储在一些“撤消操作”中
  4. 将该操作推送到撤消堆栈

当您想“撤消”时,只需将文本框中的文本恢复为步骤 0 中记录的任何内容。

于 2012-07-17T15:12:28.227 回答
0

你可以保留一个变量

  1. 输入的字符数,或
  2. 最近添加的字符串(如果你喜欢 CTRL+y 你有 CTRL+z'ed)。

另外,如果你想要一个多步 CTRL+z,你声明

List<String> additions = ...

而是在列表中添加(...)'ing 和 .Remove(...)'ing 元素。

于 2012-07-17T15:06:39.640 回答