Как предотвратить закрытие основной формы MDI от MDI Child - PullRequest
0 голосов
/ 10 мая 2010

У меня есть основная форма MDI. На нем я размещаю форму и хочу, чтобы она показывала окно сообщения до его закрытия (спрашивая пользователя, сохранять ли изменения).

Пока все хорошо, но я обнаружил, что закрытие основной формы MDI не вызывает дочернее событие FormClosing MDI. Я подумал, что просто вызову MdiChild .Close () в событии FormClosing main MDI (которое поднимается). Это швы, чтобы работать, однако это вызывает проблемы ...

В отображаемом окне сообщения я предлагаю пользователю сохранить изменения, а не сохранять изменения и отменить закрытие. Обычно это работает нормально, однако я не могу найти способ отменить событие FormClosing main MDI. Есть ли элегантный способ сделать это?

EDIT : я решил эту проблему, выдав исключение (когда пользователь решает отменить процедуру закрытия), которое фиксируется в событии FormClosing main MDI. Таким образом, я знаю, когда мне нужно отменить событие FormClosing главного MDI, и это работает нормально ... Однако я просто не могу поверить, что этот «хак» - единственный способ сделать это. Конечно, есть лучший способ?

Ответы [ 3 ]

3 голосов
/ 10 мая 2010

Я полагаю, что вы отменяете закрытие дочерней формы, когда пользователь голосует за отмену закрытия?

В этом случае я бы пошел с этой основной формой закрыть

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    if (e.CloseReason == CloseReason.UserClosing)
    {
        foreach (Form frm in this.MdiChildren)
        {
            frm.Close();
        }
    }
    e.Cancel = (this.MdiChildren.Length > 0);
}
1 голос
/ 03 августа 2010

При закрытии главной формы MDI все дочерние события Close вызываются первыми, поэтому при вызове frm.Close () в цикле foreach события Close для дочернего объекта вызываются снова (я не знаю, почему, если они должны уже закрыт).

предложение ho1 мне очень помогло. Вот мой модифицированный цикл foreach (ClosableMDIChildForm - это интерфейс, который содержит метод IsOkToClose ()):

foreach (ClosableMDIChildForm cmdif in this.MdiChildren)
{
    if (!cmdif.IsOkToClose())
    {
        e.Cancel = true;
        ((Form)mdifc).Focus();
        break;
    }
}

Очевидно, что формы this.MdiChildren должны реализовывать интерфейс ClosableMDIChildForm. Логика, позволяющая решить, нормально ли закрывать окно, идет в реализации IsOkToClose ().

1 голос
/ 10 мая 2010

Я бы предложил, чтобы вместо вызова Close для дочерних форм вы могли создать метод, подобный ReadyToClose в дочерних формах, а затем основная форма перебирает и вызывает его для каждой дочерней формы, и он будет задайте вопрос пользователю и сделайте сохранение, если необходимо, и, наконец, он вернет true, если все в порядке, чтобы продолжить.

И если все дочерние формы «проголосуют» за закрытие, то вы все закроете, иначе ничего не закроете.

...