C# отменить в приложении Windows формы
Я хочу знать, каков простой способ отменить отмену в C#
у меня есть приложение Windows Form, в окне у меня есть форма с большим количеством текстового поля, выберите поле, флажок...
после того, как пользователь заполнит и нажмет кнопку "Рассчитать", программа рассчитает все входные данные и вернет значение на экран.
Я ищу простой способ сохранить состояния после каждого вычисления и дать пользователю возможность вернуть один или несколько шагов назад.
Спасибо
4 ответа
Я не думаю, что есть какие-то стандартные встроенные средства, но вы можете найти некоторые фреймворки, чтобы сделать это самостоятельно: Undo Framework с образцом Forms: Примеры для Undo Framework
Существует также инфраструктура отслеживания отмены.
Простая реализация будет стеком. Когда пользователь выполняет операции, поместите текущее значение в стек. Когда они "отменяются", выталкивают значения из стека.
Если вы используете текстовое поле. Вы можете отменить его на 1 шаг назад, используя `Undo() метод n
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);
}
}
}
}