.NET Windows 애플리케이션에서 'UNDO'작업을 구현하는 방법은 무엇입니까?

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

  •  03-07-2019
  •  | 
  •  

문제

Win Form에는 특정 입력 필드가 있고 사용자가 일부 데이터를 입력/재 입력한다고 가정합니다.

'undo'작업으로 이전에 입력 한 데이터를 유지하는 방법은 무엇입니까?

나는 그것을 달성하는 가장 좋은 방법을 알고 싶습니다.

도움이 되었습니까?

해결책

몇 가지 옵션이 있습니다. 중요한 것은 프로젝트 초반에 디자인을 시작한다는 것입니다. 기존 프로젝트에 추가하려고 시도하면 매우 이 기능을 염두에두고 설계되지 않은 경우 비쌉니다.

다음을 활용하려는 몇 가지 기본 패턴이 있습니다.

  1. MVC 또는 관찰자 무늬. 첫 번째 열쇠는 높은 수준의 아키텍처의 종교적 또는 패턴-질로 구현이 아닙니다. 뭐 ~이다 소프트웨어는 현재 상태와 표시된 상태의 차이를 인식하고 적절하게 분리하는 것입니다. 시각적 상태와 응용 프로그램 상태간에 공통적이고 명확하게 정의 된 커플 링이 필요합니다. 이를 통해 명령을 작성하는 데 필요한 일반적인 아키텍처를 제공합니다 ( #2 참조).

  2. 그만큼 명령 무늬. 당신은 명령 패턴으로 많은 품질을 얻습니다 (마법사 생성이어야하는 것처럼 보이는 일부 코드의 비용으로 올 수 있지만). 명령 패턴에 취한 특정 접근 방식은 이벤트 처리기를 통해 구현 된 많은 명령 당 하나의 명령 당 하나의 클래스를 통해 구현 한 명령마다 명령 당 1 개 클래스 (예 :)가 다를 수 있지만 명령은 @Ralph가 스택을 구조화하는 "액션"클래스입니다. 주위에.

    이것은 약간 까다로울 수 있지만 일반적인 접근 방식은 시각적 상태에서 앱 상태로 데이터를 "커밋"하는 이벤트를 듣는 것입니다. 그만큼 Validated 이벤트는 a에 대한 좋은 훅 일 수 있습니다 Textbox. 그만큼 Click 이벤트는 a Button. 해당 커밋이 발생하면 해당 컨트롤과 관련된 명령을 작성하고 명령을 실행하려고 시도하고 명령이 성공적으로 완료되면 UNDO 스택에 명령을 추가합니다. 이제 무슨 일이 일어나고 있는지 정확히 추적하고있는 데이터를 추적하고 있습니다.

  3. 그만큼 기념물 무늬. @JP는 퍼즐의 마지막 조각을 꺼 냈습니다. 저장된 명령에서 Memento를 사용하여 명령이 실행되기 전에 영향을받는 컨트롤의 상태를 저장할 수 있습니다. 이것은 결합되어 있습니다 UnExecute() 명령 인터페이스의 회원은 작업을 수행하는 데 필요한 마지막 핵심 디자인이어야합니다.

이와 같은 구조화 된 접근 방식의 좋은 점은 이제 명령 기반에서 발생 해야하는 추가 동작을위한 자연스러운 확장 지점을 가지고 있다는 것입니다. 예를 들어 거래는 자연스럽게 적합합니다. 현재 프로젝트에서는 WPF를 사용하고 있습니다 ICommand 주어진 명령에 대한 피드백을 제공하기 위해 인터페이스 (내 WinForms 프로젝트에서) CanExecute() 주어진 시간에. 이를 통해 순수한 명령 중심 방식으로 UI 위젯을 적절하게 활성화하고 비활성화 할 수 있습니다. :)

불행한 점은이 구조에 대한 지원이 많지 않다는 것입니다. (내가 아는 한) Winforms에 내장되어 있으므로 대부분의 것을 처음부터 구축해야합니다. 단일 조각은 특히 복잡하지 않지만 각 명령에 대해 상당한 양의 보일러 플레이트 코드를 생성 할 수 있습니다. 또한 광범위한 디자인 기술입니다. 효과적이기 위해서는 응용 프로그램의 적절한 부분에서 일관되게 사용해야합니다. 이로 인해 특히 원래 코드가 단단히 결합되고 응집력이있는 경우 기능을 매우 비싸게 만듭니다.

다른 팁

WinForms/.NET에 활용할 수있는 몇 가지 유형의 내장 실행 취소 기능이 있는지 확실하지 않습니다. 그러나 당신이 실제로 찾고있는 것은 행동 목록을 관리하는 데 도움이되는 스택 데이터 구조입니다. 사용자가 할 수있는 작업을 나타내려면 일부 유형의 "액션"객체를 만들어야하며 응용 프로그램을 진행할 때 이러한 작업을 스택에 푸시해야합니다. UNDO 버튼 또는 CTRL-Z 또는 실행 취소 작업을 시작하는 모든 방법을 누르면 현재 작업을 팝업하고 응용 프로그램 상태를 이전 작업으로 복원합니다.

이것은 이것이 어떻게 작동하는지에 대한 매우 기본적이고 높은 수준의 개요이지만, 그러한 기능을 구현하면 상당히 복잡해 질 수 있다고 생각합니다. Adobe Photoshop과 같은 프로그램에서 어떻게 작동 해야하는지 상상해보십시오. :영형

이것은 달성하려는 내용에 따라 가장 좋은 방법이 아닐 수도 있지만 RichTextBox를 사용하고 해당 제어에 내장 된 실행 취소 방법을 호출 할 수 있습니다.

예를 들어:

richTextBox1.Undo();

이것 그리고 이것 도움이 될 수 있습니다.

Ctrl + Z는 개별 컨트롤에서 작동합니다.

데이터 및 BindingSource를 사용하는 경우, 호출하여 레코드에 대한 지속되지 않은 변경 사항을 "취소"할 수 있습니다. 취소 기능 또는 또는 데이터베이스의 데이터를 다시로드 할 수 있습니다.

저의 제안은 설계 및 구현을 시작하기 전에 특정 실행 취소 요구 사항과 실제 이점을 결정하는 것입니다. 내부적으로 일반 "액션"객체 스택을 통해 다중 작업 순차 실행 취소를 사용한 Winforms 앱을 상속했습니다. 그러나 내가 사용하여 사용하지 않았거나 기능을 요청하지 않은 앱 사용자 중 누구도 없었습니다! 그리고이 특정 앱이 작동하는 방식은 앱의 사용자라면 기능을 사용하는 것을 보지 못할 것입니다.

이 경우 '선택적'실행 취소 인 경우 실행 취소 기능이 더 유용했을 수 있습니다. 사용자가 데이터 커밋 전에 작성된 몇 가지 이전 편집의 단일 작업/편집을 선택하고 마지막 작업을 먼저 취소 할 수있는 대신 해당 단일 편집을 원래 상태로 복원 할 수있는 경우 등급 등이 구현 된 방식입니다.

어쨌든,이 앱에는 불필요한 복잡성과 간접성이 포함되어있어 'Grok'을 어렵고 느리게하고 기존 기능을 변경하고 향상시킵니다.이 경우 실제 혜택이 거의 없거나 전혀없는 경우. 프로젝트를 물려 받았기 때문에 실행 취소없이 새로운 기능을 구현했으며 아무도 불만을 제기하지 않았습니다.

다른 사람들이 가지고있는 것처럼 Reversi 라이브러리가 유용하다는 것을 알 수 있습니다. 보다 [http://www.codeproject.com/kb/dotnet/reversibledordodo.saspx]]]] 또는 [this] [2

[1]: http://www.codeproject.com/kb/dotnet/reversibledordore.aspx UNDO 및 REDO를 지원하기 위해 응용 프로그램을 가역적으로 만듭니다

[2]: http://www.codeproject.com/script/articles/article.aspx?aid=22502 실행 취소 REDO

실행 취소 수준에 따라 다릅니다.

어떤 의미에서 "커밋"되기 전에 값을 각 컨트롤에 대한 양식 수준 컬렉션에 저장할 수 있으며, 이는 사용자가 돌아갈 수있는 버튼을 클릭하면 "복원"할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top