2016-12-09 20 views
0

MDI 학부모 양식 (this.IsMdiContainer = true 속성 사용)에서는 ShowDialog()이라는 방법으로 어린이 양식을 표시 할 수 없습니다. 자동으로 다음 예외가 발생합니다 :ShowDialog MDI 하위를 MDI Form 부모에게 허용하는 방법은 무엇입니까?

'System.InvalidOperationException' 이가 system.windows.forms.dll에서 발생 유형의 첫 번째 예외

추가 정보 : 양식 최상위 양식을하지 않습니다 모달 대화 상자로 을 표시 할 수 없습니다. showDialog를 호출하기 전에 부모 양식 에서 양식을 제거하십시오.

누구든지이 문제를 해결 했습니까?

+1

양식의 MdiParent 속성을 설정하지 않으면 ShowDialog()가 정상적으로 작동합니다. –

답변

1

내 프로젝트에서 구현 한 쉽고 깨끗한 솔루션은 사용자가 원하는 입력을 할 때 발생하는 콜백 함수 (C#의 Action<T>)를 사용하는 것입니다. 이 ShowDialog를 사용

예 :

private void cmdGetList_Click(object sender, EventArgs e) 
{ 
    string strInput = ""; 

    frmInputBox frmDialog = new frmInputBox("User input:"); 

    if (frmDialog.ShowDialog() == DialogResult.OK) 
     strInput = frmDialog.prpResult; 
    else 
     strInput = null; 
} 

ShowDialog 는 MDI 기본 폼의 외부 입력 상자.

지금; 표시를 사용하여 용액 :

private void cmdGetList_Click(object sender, EventArgs e) 
{ 
    getInput(this, (string strResult) => 
     { 
      MessageBox.Show(strResult); 
     }); 
} 

private void getInput(Form frmParent, Action<string> callback) 
{ 
    // CUSTOM INPUT BOX 
    frmInputBox frmDialog = new frmInputBox("User input:"); 

    // EVENT TO DISPOSE THE FORM 
    frmDialog.FormClosed += (object closeSender, FormClosedEventArgs closeE) => 
    { 
     frmDialog.Dispose(); 
     frmDialog = null; 
    }; 

    frmDialog.MdiParent = frmParent; // Previosuly I set => frmParent.IsMdiContainer = true; 

    // frmDialog.ShowDialog(); <== WILL RAISE AN ERROR 
    // INSTEAD OF: 
    frmDialog.MdiParent = frmParent; 

    frmDialog.FormClosing += (object sender, FormClosingEventArgs e) => 
    { 
     if (frmDialog.DialogResult == DialogResult.OK) 
      callback(frmDialog.prpResult); 
     else 
      callback(null); 
    }; 

    frmDialog.Show(); 
} 

입력 상자 (또는 MDI 부모 폼 안에 표시 어떤 형태) ShowExample

트릭 때 관리하기위한 콜백 함수 (C 번호에 대한 조치)를 사용하는 사용자가 입력합니다.

코드 라인이 많지만 깨끗한 프로젝트를 표시하는 것은 가치가 없습니다. Final result

+0

대단히 감사합니다 ... 저는이 문제를 3 시간 동안 해결하고 해결했습니다. –