我想知道在 C# 中开发撤消的简单方法是什么
我有一个 Windows 表单应用程序,在窗口中我有一个带有很多文本框、选择框、复选框的表单...
用户填写并点击计算按钮后,程序根据所有输入计算并返回一个值到屏幕。
我搜索了一种简单的方法来保存每次计算后的状态,并让用户能够返回一个或多个步骤。
谢谢
我不认为有任何标准的内置,但你可以找到一些框架来自己做:The Undo Framework with a sample for the Forms: Samples for the Undo Framework
还有受监控的撤消框架。
一个简单的实现将是一个堆栈。当用户执行操作时,将当前值压入堆栈。当他们“撤消”时,将值从堆栈中弹出。
最简单的方法是简单地将输入文本保存在某处。
您可以通过某种方式对从上次保存输入时更改的文本进行编码,从而获得更多幻想。例如,您可以只存储与添加位置一起添加的新文本。或者您可以只存储被删除文本的位置和长度。但这更复杂,效果是一样的。
虽然文本框确实具有内置的简单撤消功能,但如果这对您不起作用,您只需在每个撤消点保存文本即可。这很容易,简单且必要。
如果您使用的是文本框。您可以使用 `Undo() 方法 n 将其撤消 1 步
txtBoxResult.Undo();
很晚了,但昨天刚收到朋友的询问。
我在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);
}
}
}
}