MayankJani Ответов: 2

Как установить подформу дочерней формы в родительской форме MDI?


уважаемый друг,

Я изучаю приложение C# windows. Я работаю над формой MDI и сталкиваюсь с проблемой, как сохранить подформу дочерней формы в форме MDI. Позвольте мне описать проблему...

1.у меня есть форма MDI под названием "Первая форма".
2. Форма MDI содержит строку меню "открыть вторую форму".
3. щелчок по кнопке "Открыть вторую форму" открывает дочернюю форму с именем "вторая форма".
4. "вторая форма" остается внутри формы MDI, поскольку она запрограммирована как дитя MDI.
5. Теперь "вторая форма" содержит командную кнопку "открыть третью форму".
6. при нажатии на кнопку открывается новая форма под названием "Третья форма".

эта третья форма не остается внутри формы MDI, когда я перетаскиваю ее и держу вне MDI.

или как я могу заморозить третью форму?


Спасибо,

Маянк

Что я уже пробовал:

Я не понимаю этой проблемы, я видел почти все свойства для MDI и дочерних форм, но не мог найти никакого решения.

2 Ответов

Рейтинг:
19

Maciej Los

Я бы сказал: Это действительно плохая идея использовать MDI. Проверить это: WindowsApplication с MDI[^]


Рейтинг:
12

BillWoodruff

Если это вообще возможно, я предлагаю вам не использовать MDI-приложения WinForm архитектуры приложения; это устаревшие; это визуально непривлекательным; и, есть лучше способы построения пользовательского интерфейса, который содержит элементы (использовать элементы управления UserControl, или панелями, или использовать элемент управления TabControl).

WinForm никогда не может быть оба форма MDIParent и форма MDIChild; надеюсь, вы не имели этого в виду здесь. Хотя вы действительно можете сделать форму, содержащуюся в другой форме (не в форме MDIParent), я настоятельно рекомендую вам никогда этого не делать.

Предложения:

1.в вашей основной форме (MDIParent) создайте экземпляры всех форм, которые вам нужно будет показать как формы MDIChild.

2. покажите эти детские формы, когда вам нужно.

3. Если вы хотите, чтобы событие в дочерней форме вызвало некоторые изменения в пользовательском интерфейсе MDI, например открытие другой дочерней формы:

3. a. в ChildForm1:

public Action NotifyMainFormToOpenChildForm2;

private void btnNotify_Click(object sender, EventArgs e)
{
    if (NotifyMainFormToOpenChildForm2 != null)
    {
        NotifyMainFormToOpenChildForm2();
    }
}
3. b. в родительской форме MDI:
private ChildForm1 cForm1;
private ChildForm2 cForm2;

private void MDIParentForm_Load(object sender, EventArgs e)
{
    cForm1 = new ChildForm1();
    cForm1.MdiParent = this;

    cForm1.NotifyMainFormToOpenChildForm2 += NotifyMainFormToOpenForm2;

    cForm2 = new ChildForm2();
    cForm2.MdiParent = this;

    cForm1.Show();
}

private void NotifyMainFormToOpenForm2()
{
    cForm2.Show();
}
В этом примере мы вводим указатель на исполняемый код, который открывает ChildForm2 (в MDIParentForm) в ChildForm1. Для этого мы использовали делегат, делегат типа Action, который дает нам простой в использовании синтаксис.

Когда кнопка нажата в ChildForm1, она проверяет, есть ли допустимая ссылка на код в делегате действия, и, если есть, она выполняет тот код, который находится в обработчике на MDIParentForm, и этот код показывает ChildForm2.

Проблема в том, чтобы перетаскивать дочерние формы MDI так, чтобы они частично выходили за границы родительской формы MDI: ну, это один из недостатков модели MDI, имхо. Чтобы это работало правильно, требуется использовать Windows API для подавления отображения полос прокрутки из-за внутреннего недостатка элемента управления.

На сегодня у меня мало времени (GMT +7), но если вы опубликуете еще один вопрос о проблеме ограничения дочерних форм границами родительской формы MDI ... и вы сделали какую-то попытку решить эту проблему для себя, я отвечу.