삽질의 현장/- .NET

#100_닷넷(.NET)_ WinForm - 모달리스(Modeless) Dialog 활용

shovelman 2015. 11. 24. 14:02


안녕하세요 삽잡이입니다.


지난 시간에는 모달리스에 대해서 알아봤습니다.

이번에는 모달리스를 통해서 ListBox를 한번 집어넣어볼까요?



세세하게 다루지 않고, 

가볍게 읽으며 넘어가는 식으로 글을 쓰고자합니다.

기존에 Window Native 영역인 

API에 대한 이해가 없으시다면 이해가 잘 안가실 수 있으니, 

API 부분부터 다시 보시는 것 또한 추천드립니다!

   







데이터는 Modeless Form 내부에 저장하지 않을 것입니다.

즉, Modeless를 호출한 부모에 저장을 하겠지요.


그런데, ListBox를 만들고 데이터에 접근하여 ListBox에 올리려면 어떻게 해야할까요?



바로, Modeless를 호출한 Form으로부터 저장되어있는 데이터를 접근하기 위해

Getter 즉, 속성을 통해 접근하면 됩니다.


ListBox를 추가/ 삭제/ 선택등에 대한 내용을 처리하고 싶다면?
ListBox는 모달리스안에 들어있는 컨트롤이기 때문에,

모달리스를 호출한 부모에게 알려줌으로써 그 작업을 수행하도록 해야합니다


즉, UI를 갱신해주고자한다면,

데이터를 변경하고 데이터를 가져다 쓰는 UI를 업데이트 시켜줘야합니다.


중요한 것은 View와 데이터는 별개라는 것입니다.
View는 단지 Data로부터 가져와 보여주는 것일 뿐이지요.

UI는 View일뿐 데이터는 따로 보관된다는 사실을 
반드시 기억하시길 바랍니다.


따라서, 효율적이고 확장가능한 유연성있는 프로그램을 만들고자한다면,
MFC에서 View와 Document 모델을 설계한 것처럼,
따로 따로 분류를 해줘야합니다.

UI는 View를 표현하는 놈입니다.
따라서 데이터와 분류되야되는 것이 정말로 합당한 것입니다.

나중에 파일 저장 혹은 네트워크 전송등 상상해보십쇼...
View 따로, Data 따로 분류하는데
머리털이 빠지시며 곧 머리에 Rising Sun의 모습이 보일 것입니다...

아무튼...
위의 예제가 뭔말인지는 못알아 들으실 수 있으나...
저렇게 따로 데이터를 빼서 보관해야합니다.

정말 반복해서 말씀드리는데,
UI와 Data가 분류되어있어야하는 것은 기본중에 기본입니다!
GUI 프로그래밍의 기본이니 반드시 지켜주세요!


만약,
UI에 관련된 것일지, Data로 따로 보관해야할 것일지 너무나도 헷갈리신다면,
하나의 Data와 여러개의 View가 있는 모습을 상상해보시길 바랍니다.

Data를 보관하는 Document는 하나이고,
이 데이터를 공유하고자하는 
즉, 쏴주고자 하는 View가 여러개일 경우를 생각해보세요.

둘 다 적용이 되어야되면 Document 측에 보관하는 것이 맞을 것이고,
각 UI에 따로 따로 나타내야한다면 그것은 View의 것이겠지요.

즉,
'이 변수는 Document에 따로 보관하는것이 좋겠어!'
라던지, 
'이 변수는 Document에 따로 보관할 필요가 없겠군!' 
이런식으로 판단할 수 있어야한다 이거지요.

만약, Document로 보관하고자 하는 데이터의 필드가 자동 속성이라면?
속성일지라도 분명 필드가 내부적으로 있는 것입니다.
따라서, 필드로 바라보고 필드로써 Document에 보관하셔야합니다.



이런식으로
Modeless는 Main Form으로부터 띄워져도,
이 띄워진 Modeless(View)들은 
Data를 따로 모아둔 Document에서 데이터를 가져와 사용할 수 있다.
이겁니다.

물론, MainForm으로 부터 필요한 데이터는 MainForm에서 가져와야겠지요.

Form으로부터 직접 수정하는 것이 아닌,
Data를 보관하고 있는 Document 로부터 갱신하고
자동으로 View에 뿌려주는... 이런 메커니즘으로 코드가 구현되어야합니다.

이를 위해서 Document에 이벤트를 만들고, 
Document를 참조하는 View들에 이벤트를 등록하는 것입니다.
이렇게 되면, View 로부터 만들어진 이벤트 핸들러를 통해
Document가 변경되었다는 사실을 알림받게 됩니다.

Document를 참조하는 모든 View에 알려줄 수 있기 때문에
각각의 View에서 갱신하라는 보고를 받을 수 있게 되지요.

이와 같은 메커니즘을 통해서 
서로 조금씩만 알자는 객체지향의 입각한 개념 또한 지켜질 수 있습니다.
수행하라는 이벤트 메시지만 날라오게 되는 것일 뿐이기 때문입니다.

저도 실력이 미미한지라...
아름다운 코드로써 블로그에 소개하는데에는
너무도 아직 부족하여 마음이 아프군요... 흑흑...

Document의 데이터가 수정되었다면, 
수정된 사실을 알려 View를 갱신시켜주는 
아름다운 GUI 프로그래밍을 하는 미래 개발자들이 됩시다!

이상 삽잡이였습니다!


<참고 : C# and the .NET4 Platform>