2016-12-09 3 views
0

В родительских формах MDI (с собственностью this.IsMdiContainer = true) нам не разрешено отображать любые формы детей с помощью метода ShowDialog(); автоматически выбросит следующее исключение:Как разрешить детям ShowDialog MDI на родительском плеере MDI?

Первый шанс исключение типа «System.InvalidOperationException» произошло в System.Windows.Forms.dll

Дополнительная информация: Форма, которая не является формой верхнего уровня не может быть отображается как модальное диалоговое окно. Удалите форму из любой родительской формы перед вызовом showDialog.

Неужели кто-то выяснил обходной путь этой проблемы?

+1

Только не устанавливайте свойство MdiParent формы и ShowDialog() будет работать нормально. –

ответ

1

Простым и чистым решением, которое я реализовал в своих проектах, является использование функции обратного вызова (Action<T> в C#), которая запускается, когда пользователь вводит требуемый ввод.

Пример использования 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 Main Form.

В настоящее время; решение с помощью Показать:

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 часов и решил. –

Смежные вопросы