C# 在windows窗体C中撤消通过按钮单击事件插入文本#

C# 在windows窗体C中撤消通过按钮单击事件插入文本#,c#,winforms,C#,Winforms,我正在用C#开发一个小型windows窗体应用程序。我有很多按钮和一个组合框,点击后在富文本框中的当前光标位置添加特定文本。是否有任何方法可以撤消此文本插入?。我尝试过richTextBox.Undo()方法,但它仅在通过键盘添加到富文本框的最新文本时有效。但是如果是通过按钮或组合框,那么什么也不会发生,而且光标也会消失。 这是我在单击按钮时添加文本的方法,我希望它在单击撤消按钮或CTRL+Z时撤消 private void mybuttonclick(object sender, Ev

我正在用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}");
    }
private void MyButton单击(对象发送方,事件参数e)
{
//------点击POS标签按钮插入标签的方法-------//
按钮btn=(按钮)发送者;//接收有关单击哪个按钮的信息。
字符串strInsert=“”+”;//插入“”,并在标记末尾添加一个额外的空格
//在当前光标位置插入标记。
richTextBox1.Focus();
int i=richTextBox1.SelectionStart;
richTextBox1.Text=richTextBox1.Text.Insert(richTextBox1.SelectionStart,strInsert);
richTextBox1.SelectionStart=i+strInsert.Length;
//将光标移动到要标记的下一个单词。
richTextBox1.Focus();
SendKeys.SendWait(“^{LEFT}”);
}
需要帮助


问候

您可以使用

  • 输入的字符数,或
  • 最近添加的字符串(如果您喜欢CTRL+y,则使用CTRL+z'ed)
  • 另外,如果您希望使用多步骤CTRL+z,可以声明

    List<String> additions = ...
    
    列表添加=。。。
    
    而是在列表中添加(…)'ing和删除(…)'ing元素。

    是的,您可以创建
    列表
    因此,列表将跟踪插入并回滚以撤消。

    代码项目中有几个可用的“”,例如,有一个文本框示例:


    如果我必须解决这个问题,我会下载这个示例,看看如何调整它以满足我自己的需求。

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

    对于文本,我会这样做:

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

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

    对于“文本”一词,我深表歉意。。。。它是没有“an”的简单“text”,我知道有些人使用string而不是string,但我仍然认为,因为它是一个对象而不是本地对象,所以应该大写。在这一点上我可能会被反驳,但在此之前,让我好好享受。
    string
    是一种C#内置类型<代码>字符串是.NET类型
    string
    映射到
    string
    +1,在这种情况下,通过示例学习通常对我很有帮助