2010-12-06 2 views
4

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

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

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; 
     } 
    } 

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

+0

Кроме того, кто-то может объяснить разницу в выполнении при использовании формы закрыто против формы закрытия? И что я должен использовать для вышесказанного? – CODe 2010-12-06 15:50:39

ответ

1

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

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

0

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

Кроме того, FormClosing позволит вам отменить закрытие, а FormClosed не предоставит вам эту опцию.

0

Не используйте событие 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; 
    } 
} 
0

Когда пометить ParentForm как MdiContainer, установив IsMdiContainer истина, событие 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 Child добавляются в набор элементов управления 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 для дочерних форм, вы можете легко определить, закрыта ли дочерняя форма или нет.

0

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

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

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

objB.MdiParent = this; 

objB.Activated += SetupToolStripMenu_PlantMasterRecipe; 

objB.Deactivate += DisposeToolStripMenu; 

objB.Show(); 
Смежные вопросы