0

我想知道在 C# 中开发撤消的简单方法是什么

我有一个 Windows 表单应用程序,在窗口中我有一个带有很多文本框、选择框、复选框的表单...

用户填写并点击计算按钮后,程序根据所有输入计算并返回一个值到屏幕。

我搜索了一种简单的方法来保存每次计算后的状态,并让用户能够返回一个或多个步骤。

谢谢

4

5 回答 5

4

我不认为有任何标准的内置,但你可以找到一些框架来自己做:The Undo Framework with a sample for the Forms: Samples for the Undo Framework

还有受监控的撤消框架

于 2010-12-16T18:44:34.220 回答
2

一个简单的实现将是一个堆栈。当用户执行操作时,将当前值压入堆栈。当他们“撤消”时,将值从堆栈中弹出。

于 2010-12-16T19:00:18.047 回答
0

最简单的方法是简单地将输入文本保存在某处。

您可以通过某种方式对从上次保存输入时更改的文本进行编码,从而获得更多幻想。例如,您可以只存储与添加位置一起添加的新文本。或者您可以只存储被删除文本的位置和长度。但这更复杂,效果是一样的。

虽然文本框确实具有内置的简单撤消功能,但如果这对您不起作用,您只需在每个撤消点保存文本即可。这很容易,简单且必要。

于 2010-12-16T18:43:39.300 回答
0

如果您使用的是文本框。您可以使用 `Undo() 方法 n 将其撤消 1 步

txtBoxResult.Undo();

于 2010-12-16T18:47:28.753 回答
0

很晚了,但昨天刚收到朋友的询问。

我在richtextbox 中开发了这个简单的撤消重做功能。是的,有很多更好的方法,但作为一种快速解决方案,它可以被使用。

using System;
using System.Windows.Forms;

namespace Undo_Redo
{
    public partial class Form1 : Form
    {
        public string[] RTBRedoUndo;
        public int StackCount = -1;
        public bool IsRedoUndo = false;
        public string[] RTBRedo;
        public int RedoStackCount = -1;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            RTBRedoUndo = new string[10000];
            RTBRedo = new string[10000];

        }
        private void btn_undo_Click(object sender, EventArgs e)
        {

            if (StackCount > -1 && RTBRedoUndo[StackCount] != null)
            {
                IsRedoUndo = true;
                RedoStackCount += 1;
                RTBRedo[RedoStackCount] = RTBRedoUndo[StackCount];
                richTextBox1.Text = richTextBox1.Text.Substring(0, richTextBox1.Text.Length - 1);
                RTBRedoUndo[StackCount] = null;
                StackCount -= 1;

            }
        }

        private void btn_redo_Click(object sender, EventArgs e)
        {
            if (RedoStackCount > -1 && RTBRedo[RedoStackCount] != null)
            {
                IsRedoUndo = true;
                StackCount += 1;
                RTBRedoUndo[StackCount] = RTBRedo[RedoStackCount];
                richTextBox1.Text = richTextBox1.Text + RTBRedo[RedoStackCount];
                RTBRedo[RedoStackCount] = null;
                RedoStackCount -= 1;
            }
        }

        private void btn_redo_MouseUp(object sender, MouseEventArgs e)
        {
            IsRedoUndo = false;
        }

        private void btn_undo_MouseUp(object sender, MouseEventArgs e)
        {
            IsRedoUndo = false;
        }

        private void richTextBox1_TextChanged(object sender, EventArgs e)
        {
            if (IsRedoUndo == false)
            {
                StackCount += 1;
                RTBRedoUndo[StackCount] = richTextBox1.Text.Substring(richTextBox1.Text.Length - 1, 1);
            }
        }
    }
}
于 2020-05-14T11:05:52.000 回答