2016-12-09 58 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主要形式外。

現在;使用顯示解決方案:

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個小時,並得到解決。 –