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);
            }
        }
    }
}
Другие вопросы по тегам