Как реализовать операцию «отменить» в приложении Windows .net?

StackOverflow https://stackoverflow.com/questions/800940

  •  03-07-2019
  •  | 
  •  

Вопрос

Предположим, что форма выигрыша имеет определенные поля ввода, и пользователь вводит/повторно вводит некоторые данные.

Как сохранить данные, ранее введенные с помощью операции отмены?

Просто я хочу знать, как лучше всего этого добиться.

Это было полезно?

Решение

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

Есть несколько фундаментальных шаблонов, которыми вы захотите воспользоваться:

  1. MVC или наблюдатель шаблон.Первый ключ — это не столько религиозная или фанатичная реализация вашей высокоуровневой архитектуры.Что является важно, чтобы ваше программное обеспечение распознавало разницу между своим текущим состоянием и отображаемым состоянием и соответствующим образом отделяло их.Между вашим визуальным состоянием и состоянием вашего приложения должна быть общая, четко определенная связь.Это предоставляет вам общую архитектуру, необходимую для создания команды (см. № 2).

  2. А Команда шаблон.Используя шаблон команды, вы получаете высокое качество (хотя за это может потребоваться некоторый код, который выглядит так, как будто он должен быть сгенерирован мастером).Конкретный подход, который вы применяете к шаблону команд, может различаться (например, один класс для каждой команды с реализацией через переопределения или один класс для многих команд с реализацией через обработчики событий), но команды — это класс «действия», который @Ralph предложил структурировать стек. вокруг.

    Это может быть немного сложно, но общий подход заключается в прослушивании события, которое «передаёт» данные из визуального состояния в состояние приложения.А Validated событие может стать хорошей зацепкой для TextboxClick событие имело бы больше смысла для Button.Когда происходит эта фиксация, вы создаете команду, связанную с этим элементом управления, пытаетесь выполнить команду и добавляете команду в свой стек отмены, если команда завершается успешно.Теперь вы отслеживаете именно то, что происходит, и именно те данные, с которыми это происходит.

  3. А сувенир шаблон.@JP Вытащил последний кусочек головоломки.Вы можете использовать память о сохраненной команде, чтобы сохранить состояние затронутого элемента управления до выполнения команды.Это, в сочетании с UnExecute() элемент интерфейса вашей команды, должен быть последней основной частью дизайна, необходимой вам для выполнения вашей задачи.

Преимущество такого структурированного подхода заключается в том, что теперь у вас есть естественная точка расширения для дополнительного поведения, которое должно выполняться на основе команд.Транзакции, например, вполне естественны.В моем текущем проекте я использую WPF ICommand интерфейс (в моем проекте winforms), чтобы предоставить информацию о том, является ли данная команда CanExecute() в любой момент времени.Это позволяет мне соответствующим образом включать и отключать виджеты пользовательского интерфейса исключительно с помощью команд.:)

К сожалению, эта структура, встроенная в Winforms, не имеет широкой поддержки (насколько мне известно), поэтому вам придется создавать большую ее часть с нуля.Ни одна часть не является особенно сложной, но вы можете обнаружить, что генерируете изрядное количество шаблонного кода для каждой команды.Это также широко распространенная техника дизайна.Чтобы он был эффективным, его необходимо использовать последовательно во всех соответствующих частях приложения.Это делает модернизацию функциональности довольно дорогой, особенно если исходный код тесно связан и несвязен.

Другие советы

Я не уверен, есть ли в WinForms/.Net какая-то встроенная функция отмены, которой вы можете воспользоваться.Но на самом деле вам нужна структура данных Stack, которая поможет вам управлять списком действий.Вам нужно будет создать некоторый тип объекта «действия», чтобы представить действия, которые может выполнять пользователь, и по мере их прохождения через приложение вам нужно будет помещать эти действия в стек.Когда они нажмут кнопку отмены или Ctrl-Z или любой другой метод инициирования действия отмены, вы отключите текущее действие и восстановите состояние приложения до предыдущего действия.

Это очень простой и общий обзор того, как это будет работать, но я полагаю, что реализация такой функции может оказаться довольно сложной.Только представьте, как это должно работать с такой программой, как Adobe Photoshop.:О

Возможно, это не лучший способ сделать это в зависимости от того, чего вы пытаетесь достичь, но вы можете использовать richtextbox и вызвать метод отмены, встроенный в этот элемент управления.

Например:

richTextBox1.Undo();

Этот и этот может помочь.

CTRL + Z работает с отдельными элементами управления.

Если вы работаете с данными и BindingSource, вы можете «отменить» несохраненные изменения в записях, вызвав метод ОтменаРедактировать или, альтернативно, вы можете перезагрузить данные для базы данных.

Я предлагаю определить конкретные требования к отмене и ее практические преимущества перед началом проектирования и реализации.Я унаследовал приложение WinForms, которое использовало последовательную отмену нескольких операций через стек общих объектов «действий» внутри страны.Однако оказалось, что ни один из пользователей приложения, с которым я разговаривал, не использовал и не просил эту функцию!И судя по тому, как работает это конкретное приложение, если бы я был его пользователем, я бы просто не увидел себя использующим эту функцию.

Функция отмены могла бы быть более полезной в этом случае, если бы это была «выборочная» отмена;где пользователь может выбрать любую одну операцию/редактирование из нескольких предыдущих изменений, сделанных до фиксации данных, и восстановить это единственное редактирование в исходное состояние вместо того, чтобы иметь возможность сначала отменить только последнюю операцию, а затем предпоследнюю операцию , и т. д.вот как это было реализовано.

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

Вы также можете найти библиотеку Reversi полезной, как и некоторые другие.Видеть [http://www.codeproject.com/KB/dotnet/reversibleundoredo.aspx][1] или [это][2]

[1]: http://www.codeproject.com/KB/dotnet/reversibleundoredo.aspx Сделайте ваше приложение обратимым для поддержки отмены и повтора

[2]: http://www.codeproject.com/script/Articles/Article.aspx?aid=22502 Отменить повторить

Зависит от того, сколько уровней отмены вы хотите иметь.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top