C # отменить в приложении Windows Form

Я хочу знать, как легко выполнить отмену в C #

У меня есть приложение формы Windows, в окне у меня есть форма с большим количеством текстового поля, поля выбора, флажка ...

после того, как пользователь заполнит и нажмет кнопку «Рассчитать», программа выполнит расчет в соответствии со всеми введенными данными и вернет значение на экран.

Я ищу простой способ сохранить состояния после каждого вычисления и дать пользователю возможность вернуться на один или несколько шагов назад.

Благодарность


person Haim Evgi    schedule 16.12.2010    source источник


Ответы (5)


Я не думаю, что есть какие-либо стандартные встроенные функции, но вы можете найти несколько фреймворков, чтобы сделать это самостоятельно: The Undo Framework с образцом для форм: Примеры для платформы отмены

Также существует Monitored Undo Framework.

person Simon Mourier    schedule 16.12.2010

Простая реализация - стек. Когда пользователь выполняет операции, помещает текущее значение в стек. Когда они «отменяют», выталкивают значения из стека.

person Ed S.    schedule 16.12.2010
comment
это не один элемент, это много значений - person Haim Evgi; 16.12.2010

Самый простой способ - просто сохранить где-нибудь введенный текст.

Вы могли бы получить больше фантазии, каким-то образом закодировав только текст, который изменился с момента последнего сохранения ввода. Например, вы можете сохранить только новый текст, который был добавлен вместе с положением, в котором он был добавлен. Или вы можете сохранить только позицию и длину текста, который был удален. Но это более сложно, и эффект тот же.

Хотя в текстовое поле действительно встроена простая функция отмены, если это не сработает для вас, вам просто нужно будет сохранять текст в каждой точке отмены. Это легко, просто и необходимо.

person Jonathan Wood    schedule 16.12.2010

Если вы используете Textbox. Вы можете отменить его на 1 шаг назад, используя метод `Undo () n

txtBoxResult.Undo();

person Javed Akram    schedule 16.12.2010

Уже довольно поздно, но вчера только что получил запрос от друга.

Я разработал эту простую функцию отмены повтора в 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);
            }
        }
    }
}
person Rizwan    schedule 14.05.2020
comment
Вы сказали нам, что разработали решение ... Но вы не задали вопрос. - person PKD; 14.05.2020
comment
Было бы намного лучше, если бы вы кратко описали проблему (которую вы решили с помощью приведенного выше кода) и задали более конкретный вопрос относительно улучшения :) - person S.Dayneko; 14.05.2020