2008-10-27 4 views
5

나는이 사람과 다소 달라 붙어있어 누군가 나를 도울 수 있기를 바란다.DialogResult가 아닌 Object를 반환하는 Windows Forms 모달 대화 상자

Winforms 응용 프로그램을 수행하고 있으며 값을 반환하는 모달 대화 상자 (form.ShowDialog)를 표시해야합니다 (사용자에게 일부 값을 묻고 개체로 래핑).

개체에 대한 참조를 제공하거나 나중에 public 속성의 일부 형식에 따라 데이터를 읽는 대신이 작업을 수행하는 방법을 알 수 없습니다.

저는 ShowDialog가 다른 것을 돌려 주길 원합니다.하지만 작동하지 않습니다. 이렇게하려면 "좋은"방법이 있습니까?

나는 문제가 새로운 것은 아니지만 거의 아무도 Winforms를 더 이상 보이지 않기 때문에 웹에서 어떤 지침도 찾을 수 없다고 확신합니다.

public class MyDialog : Form 
{ 
    // todo: think of a better method name :) 
    public static MyObject ShowAndReturnObject() 
    { 
     var dlg = new MyDialog(); 
     if (new dlg.ShowDialog() == DialogResult.OK) 
     { 
      var obj = // construct an instance of MyObject from dlg 
      return obj; 
     } 
     else 
     { 
      return null; 
     } 
    } 
} 

지금 당신이 thusly 히 프로그램에서이 호출 할 수 있습니다 :

답변

12

과 같이 양식에 정적 메서드를 추가

var myObject = MyDialog.ShowAndReturnObject(); 

... 그리고 그들은 대화, 즉, myObject를 취소하는 경우 null가됩니다.

이제 모든 것을 말하면서 ShowDialog()를 호출 한 후 읽는 폼의 클래스에 속성을 추가하는 것이 더 나은 방법이라고 생각합니다.

+0

Dammit :) 거의 정확히 내가 가진 것입니다. (내 메서드 ShowDialog를 호출하는 것 - 그리고 왜 그렇지 않은 것입니까?). –

+0

아, 그리고 코드 블록을 들여 쓰면 문법이 달라집니다. –

+0

흠 - 내 전화를하지 않았습니다. ShowDialog '사촌과 같은 이름의 정적 메서드를 사용하려고 애쓰는 것에 대해 걱정했습니다. 인스턴스 메서드이며 반환 유형에 의해서만 오버로드됩니다. 나는 그것이 가능하다고 생각하지 않는다. –

0

또는 기본적으로 매트 해밀턴이 수행하는 양식 클래스 내에 새 ShowDialog 메서드를 만들 수 있습니다. 어쩌면 확장 방법 일 수도 있습니다. 문제가 많은 형태의 폼 일 경우 확장 방법 일 수도 있습니다.

2

당신은 반환 값을 나타내는 대화 상자 내부의 공용 속성을 만들 수 있습니다

/* Caller Code */ 
var dlg = new MyDialog(); 
if(dlg.ShowDialog() == DialogResult.OK) 
    MessageBox.Show(dlg.MyResult); 

/* Dialog Code */ 
public string MyResult { get { return textBox1.Text; } } 

private void btnOk_Click(object sender, EventArgs e) 
{ 
    DialogResult = System.Windows.Forms.DialogResult.OK; 
    this.Close(); 
} 
0

대화 형태의 공공 재산은 의미가 있습니다. 그러나 확인 단추 클릭 이벤트 핸들러에서 대화 상자를 닫지 마십시오. DialogResult 속성을 할당하면 대화 상자 양식이 숨겨집니다. 그런 다음 호출 양식에서 DialogResult를 검사하여 확인 또는 취소를 클릭했는지 확인할 수 있습니다. 그런 다음 확인 버튼을 클릭하고 대화 상자 양식을 삭제하면 public 속성에 액세스 할 수 있습니다. 이것은 호출 양식에서 try-catch-finally 블록을 사용하거나 using 문을 사용하여 수행해야합니다. 메모리 누수를 방지하려면 모달 대화 상자를 삭제해야합니다.

관련 문제