С # MDI Parent определяет, когда MDI Child закрывается?

Я пытаюсь обнаружить на родительском элементе MDI, когда моя дочерняя форма MDI закрывается, и реагировать соответствующим образом. Родитель MDI не должен ничего делать, пока дочерний элемент MDI не закроется. Вот мой код, я не уверен, что делаю не так, но добавленный мной метод закрытого события формы никогда не вызывается ...

Следующий код находится в родительском классе MDI, если это не было очевидно.

    private void keyValidation()
    {
        if (Properties.Settings.Default.Unlock == true)
            return;
        else
        {
            menu.Enabled = false;
            statusStrip.Enabled = false;

            ValidationForm vf = new ValidationForm();
            vf.MdiParent = this;
            vf.Show();
            vf.FormClosed += new FormClosedEventHandler(validationForm_FormClosed);
        }
    }

    void validationForm_FormClosed(object sender, FormClosedEventArgs e)
    {
        MessageBox.Show("Got here");
        if (Properties.Settings.Default.Unlock == true)
        {
            menu.Enabled = true;
            statusStrip.Enabled = true;
        }
    }

Спасибо за любую помощь!


person CODe    schedule 06.12.2010    source источник
comment
Кроме того, может ли кто-нибудь объяснить разницу в исполнении при использовании закрытой формы и закрытия формы? И что я должен использовать для вышеперечисленного?   -  person CODe    schedule 06.12.2010
comment
Form Closing событие вызывается до Closed. Вы можете использовать событие Closing, чтобы узнать, нужно ли пользователю, например, сохранить документ.   -  person Neil Knight    schedule 06.12.2010
comment
Спасибо за разъяснения, я полагаю, это последняя попытка спасти все, что форма удерживала.   -  person CODe    schedule 06.12.2010
comment
FormClosing также позволяет отменить закрытие, установив FormClosingEventArgs Cancel собственности на true.   -  person Powerlord    schedule 06.12.2010
comment
Мы не смотрим на настоящий код. Как написано, должно работать. Но да, это почти наверняка должен быть диалог, а не дочерний элемент MDI.   -  person Hans Passant    schedule 06.12.2010


Ответы (6)


Хотя это на самом деле не решает проблему, о которой вы говорите, судя по варианту использования, вы можете рассмотреть возможность открытия формы проверки как модального диалогового окна, а не как дочернего элемента MDI.

Вы можете сделать это с помощью метода формы ShowDialog(), который у вас есть Show() сейчас. Имейте в виду, что ShowDialog() также может возвращать DialogResult < / a>, если вы назначите их кнопкам на другой форме.

person Powerlord    schedule 06.12.2010

Может быть, просто возможно, у вас есть ДЕТСКАЯ анкета, которая СКРЫВАЕТ, а не закрывает. Попробуйте подключить VisibleChanged и посмотрите, что произойдет.

Кроме того, FormClosing позволяет отменить закрытие, а FormClosed не дает вам такой возможности.

person Daniel Mošmondor    schedule 06.12.2010

Не используйте событие Closed. Вместо этого используйте событие FormClosing:

private void frmMain_FormClosing(object sender, FormClosingEventArgs e){
  if (MessageBox.Show("Are you sure you want to Exit", "Confirmation", MessageBoxButtons.YesNo,MessageBoxIcon.Information) == System.Windows.Forms.DialogResult.No) {
    e.Cancel = true;
  }
}
person mehmood Siddique    schedule 04.01.2012

Если пометить ParentForm как MdiContainer, установив для IsMdiContainer значение true, возникает событие ParentForm.ControlAdded для добавления элемента управления «MdiClient» в родительскую форму. Поэтому при добавлении MdiClient в родительскую форму MDI мы можем вызвать событие ControlAdded для элемента управления MdiClient, как показано ниже,

  public ParentForm()
  {
    InitializeComponent();
    this.ControlAdded += Form1_ControlAdded;
    this.IsMdiContainer = true;

Нам нужно поднять MdiClient.ControlAdded, как показано ниже,

    void Form1_ControlAdded(object sender, ControlEventArgs e)
      {
           if(e.Control is MdiClient)
                e.Control.ControlAdded += MdiClient_ControlAdded;

      }

По умолчанию дочерние формы MDI добавляются в коллекцию элементов управления MdiClient в родительской форме. Поэтому при установке значения ChildForm.MdiParent в качестве родительской формы возникает событие ControlAdded для MdiClient.

void MdiClient_ControlAdded(object sender, ControlEventArgs e)
{
    if (e.Control is Form)
        {
            var form = e.Control as Form;
            form.FormClosing += form_FormClosing;
            form.FormClosed += form_FormClosed;
        }
}

В этом выше метод MdiClient_ControlAdded возникает, когда дочерняя форма добавляется в родительскую форму MDI. Таким образом, вызывая события FormClosing и FormClosed для дочерних форм, вы можете легко определить, закрыта ли дочерняя форма или нет.

person Jagadeesan    schedule 24.03.2017

Почему вы делаете так много вещей, когда вы можете просто вызвать обработчик событий MDI Parent для MDI Child?

Предположим, я хочу делать определенные вещи, когда мой ребенок будет активирован или деактивирован. Вам просто нужно объявить некоторые обработчики событий MDI Parent (например, SetupToolStripMenu_PlantMasterRecipe) и упомянуть некоторую логику внутри того, что вы хотите сделать. Таким образом, вы можете управлять поведением каждого объекта MDI Child из MDI Parent.

Здесь objB - это моя дочерняя форма, и я пишу этот код внутри MDI Parent:

objB.MdiParent = this;

objB.Activated += SetupToolStripMenu_PlantMasterRecipe;

objB.Deactivate += DisposeToolStripMenu;

objB.Show();
person Kingshuk Banu    schedule 29.06.2017

На mdiparent сделать общедоступную функцию

public void MakeMenuVisible()
{
MainMenu.visible = true;
}

Затем в дочерней форме вы можете запустить такую ​​функцию

private void ChildForm_FormClosed(object sender, FormClosedEventArgs e)
{
//Cast MdiParent to Mainform
((mainform)this.MdiParent).MakeMenuVisible();  
}
person Dappertje    schedule 09.01.2019