2016-12-09 49 views
0

MDI親フォーム(プロパティーthis.IsMdiContainer = true)では、メソッドShowDialog()を持つ子フォームを表示することはできません。自動的に次の例外がスローされます。どのようにMDIフォームの親にShowDialog MDIの子供を許可しますか?

「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メインフォームの外の入力ボックス。

Now;ショーを使用したソリューション:

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時間この問題を解決して解決しました。 –

関連する問題