2008-11-01 2 views
2

일부 사용자 입력을 수집하려면 모달 대화 상자가 필요합니다. 그런 다음 응용 프로그램 MainFrame에서 동일한 데이터를 사용해야합니다.메인 프레임 (또는 메인 대화 상자)과 모달 대화 상자간에 데이터를 전달하는 가장 좋은 방법은 무엇입니까?

보통 내 모달 대화 상자에는 필요한 데이터를 저장할 수있는 데이터 유형에 대한 포인터가 있으며, 모달 대화 상자가 닫히면 데이터를 복구 할 수 있도록이 객체를 MainFrame에서 참조로 전달합니다. 사용자.

데이터를 전달하는 가장 좋은 방법입니까?

기분이 좋지 않습니다!

답변

3

사용자가 대화 상자 (DialogResult.OK)를 닫은 후에 데이터를 전달하기 때문에 MainFrame 참조가 없어도 쉽게이 작업을 수행 할 수 있습니다.

대화 상자에 userNameTextBox라는 TextBox가 있고 OK 버튼을 눌러 대화 상자를 종료하는 버튼이 있다고 가정 해 보겠습니다. userNameTextBox를 public으로 설정하거나 (권장하지 않음) 텍스트를 반환하는 속성을 추가 할 수 있습니다. 대화 상자가 종료 된 후

public string UserName 
{ 
    get { return userNameTextBox.Text; } 
} 

그리고

이 값을 얻기 위해, 당신은 단지 수행

사용자로부터 하나 개 또는 두 개의 값을 수집 할 때 사무엘의 제안을 완벽하게 적합 @
Dialog dialog = new Dialog(); 
if (dialog.ShowDialog() == DialogResult.OK) 
{ 
    string username = dialog.UserName; 
} 
+0

당신은이 접근 방식을 선택하겠습니까 - 이것은 내가 제안한 것의 더 깨끗한 버전입니다 - 이벤트 기반의 의사 소통보다? – JohnIdol

+0

나는이 솔루션을 향하여 기울이고있다. – JohnIdol

0

일반적으로 단일 클래스 또는 다른 데이터 유형을 사용하여 데이터를 전송할 수 있습니다. 따라서 대화 상자는 클래스의 속성을 변경하는 데 사용됩니다. 왜이게 옳지 않니?

[humor]메인 프레임에서, 나는 당신이 큰 오래된 (althoug은 여전히 ​​살아 있고 발로 걷고있는) 컴퓨터를 의미하지 않는다고 가정합니다. 그렇지 않으면, 나는 TCP/IP가 좋은 선택 일 것이라고 생각한다. [/ humor]

+0

이 방법으로 경계 객체를 연결하려고합니다. – JohnIdol

0

이 작업을 수행하는 가장 좋은 방법은 데이터를 이벤트로 패키지화하여 이벤트 버스로 보내는 것입니다.

이렇게하면 대화 상자가 메인 프레임과 분리됩니다. 이벤트를 올바르게 디자인하면 대화 상자를 사용하는 것으로 제한되지 않습니다.

언어 및 환경에 따라이 이벤트 시스템을 쉽고 저렴하게 구현할 수 있습니다. 버전 클래스 기반 객체 간 통신이라고 부릅니다.

+0

예를 들어주세요. – Aheho

+0

경계 객체를 분리하는 방법을 찾고 있습니다. 따라서이 접근법이 좋게 들립니다. .NET 환경에서 wokring하고 있다면 EventArgs에 데이터를 패키징하는 것이 좋을 것입니다. C++/MFC는 어떻습니까? – JohnIdol

+0

디커플링 열풍은 멈춰야합니다. "모든 것이 손톱처럼 보입니다." 이 질문은 이런 종류의 오버 엔지니어링을 필요로하지 않는 간단한 애플리케이션처럼 들린다. –

1

.

많은 값을 얻는다면 문제의 해결책도 좋습니다.

조기 최적화에 걸리지 않게하고 분리 된 솔루션에 과부하가 걸리지 않도록하십시오. 경계 객체에 의해 당신은 메인 프레임과 대화 상자에서 참조하는 데이터 구조 인스턴스를 참조한다고 가정합니다. 이 객체를 참조하는 대화 상자와 메인 프레임의 문제점은 무엇입니까? 이 시나리오에서 경계/전송 객체를 분리하는 이점은 무엇입니까?

여기서 볼 수있는 유일한 디커플링 결과는 메인 프레임을 데이터를 전달하는 특정 구현에서 분리하는 것입니다. 따라서 메인 프레임이 Dialog를 인스턴스화하고 Dialog를 호출하는 것보다.ShowModal은 의존성 주입 (같은 모달 대화로 일어날 것)을 IDataYouNeedGetter와 메인 프레임을 제공 할 것이며, 적절한 시간에 메인 프레임

myGetter.SetTransferObject(dataStructInstance) 
myGetter.GoGetTheData() 
// do stuff with dataStructInstance now that myGetter set it up. 

을 할 것입니다하지만, 간접 레이어를 추가 할 이유가 없다 디커플링에 대한 구체적인 필요성을 이미 알고있는 경우가 아니면

+0

경계 객체 란 UI 요소 (MainFrame/Dialog - 등)를 나타내는 클래스의 인스턴스를 의미하지만, 고려해야 할 사항은 분명하다. – JohnIdol

관련 문제