C # MDI Родитель обнаруживает, когда MDI Child закрывается? - PullRequest
5 голосов
/ 06 декабря 2010

Я пытаюсь определить, когда родительский объект 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;
        }
    }

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

Ответы [ 6 ]

1 голос
/ 06 декабря 2010

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

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

0 голосов
/ 09 января 2019

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

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

Тогда на childform вы можете запустить функцию, подобную этой

private void ChildForm_FormClosed(object sender, FormClosedEventArgs e)
{
//Cast MdiParent to Mainform
((mainform)this.MdiParent).MakeMenuVisible();  
}
0 голосов
/ 29 июня 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();
0 голосов
/ 24 марта 2017

Если пометить 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 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 голосов
/ 04 января 2012

Не используйте событие 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 голосов
/ 06 декабря 2010

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

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

...