Member 12198006 Ответов: 2

Как я могу добиться отмены / повтора массива в приложении windows с помощью VB.NET


Всем привет,

Я новичок в этом деле, поэтому мне нужна помощь.
Я только что закончил свое первое приложение Windows forms, и пришло время вставить код отмены/повтора.
Приложение использует двумерный массив, на котором хранятся все данные из comboboxes, textboxes, checkboxes, labels и т. д. Мне нужен код, чтобы отменить / повторить изменения этого двумерного массива. Кто-нибудь может помочь?

Что я уже пробовал:

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

[no name]

"Кто-нибудь может помочь?", я уверен, что некоторые могли бы помочь, но вы не сказали, в чем конкретно вам нужна помощь.

2 Ответов

Рейтинг:
19

Nforndzi Ngenge

Вы можете создать динамический массив, в котором будут храниться все выполняемые действия.
например:

'Create a arraylist to store states
dim actions as new arraylist
'call CreateAction to register a state
Private sub CreateAction()
   'Clone (create a copy) your data and store in an object, say data
   actions.add(data)
End Sub

To undo, you simply go back and retrieve the data from the array. 
k = 1 is one step back
k = 2 is two steps back
Private sub UndoAction(byval k as integer)
   data = actions(actions.count - 1 - k)  
End Sub 


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


Рейтинг:
1

David O'Neil

Здесь, в CodeProject, есть тонны примеров кода отмены/повтора. Или вы также можете посмотреть на какой-нибудь старый код, который я написал (RandomMonkeyWorks-отмена / повтор в C++[^]). Это не так VB.Net, и вам придется изменить его синтаксически в соответствии с вашим языком, но это должно обеспечить основу для применения в вашем случае.

Если вы используете мой фреймворк (и несколько других фреймворков), вам придется добавить обработку в обработчики команд для заполнения стека прошлых действий и написать код отмены и повтора для обработки фактической отмены и повтора обработки 2d-массива. Я бы просто создал список предыдущих значений и позиции x,y этих значений в стеке прошлых действий. Затем, после того как вы связали "Ctrl-Z" и "Ctrl-Y" (или любой другой командный сигнал) в "undo" и "redo", вы используете код "undo" и "redo", чтобы найти текущее значение этой позиции x, y,сохранить его и поместить следующее (или Предыдущее) значение в эту позицию x, y.

Простой пример приведен на странице, на которую я ссылался.

Надеюсь, это поможет.