MDI Form обнаружение с дочерней формой добавлено или удалено - PullRequest
3 голосов
/ 11 февраля 2009

Могу ли я использовать событие, чтобы узнать, была ли дочерняя форма добавлена ​​или удалена из родительского MDI-файла?

Ответы [ 8 ]

7 голосов
/ 11 февраля 2009

Да. В основной форме MDI подключитесь к событию MdiChildActivation.

Вроде так:

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.MdiChildActivate += new EventHandler(Form1_MdiChildActivate);
        }

        void Form1_MdiChildActivate(object sender, EventArgs e)
        {
            MessageBox.Show("Activated");
        }

        private void addToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Form form2 = new Form2();
            form2.MdiParent = this;
            form2.Show();
        }
    }

И это событие сработает, когда дочерняя форма будет активирована или деактивирована.

4 голосов
/ 20 мая 2009

Подключите событие MdiChildActivate и сохраните список распознанных детей. Когда активируется новая форма, также подключите событие FormClosed.

private List<Form> ChildFormList = new List<Form>();

private void MyForm_MdiChildActivate(object sender, EventArgs e)
{
    Form f = this.ActiveMdiChild;

    if (f == null)
    {
        //the last child form was just closed
        return;
    }

    if (!ChildFormList.Contains(f))
    {
        //a new child form was created
        ChildFormList.Add(f);
        f.FormClosed += new FormClosedEventHandler(ChildFormClosed);
    }
    else
    {
        //activated existing form
    }
}

private void ChildFormClosed(object sender, FormClosedEventArgs e)
{
    //a child form was closed
    Form f = (Form)sender;
    ChildFormList.Remove(f);
}
2 голосов
/ 11 февраля 2009

Нет, нет. Вам нужно будет создать подкласс Form и предоставить конкретные события, которые будут указывать, когда дочерний объект будет добавлен, а затем направить все вложения дочерних форм через метод, который соединит дочернюю форму, а также вызвать событие.

1 голос
/ 23 марта 2017

Да, вы можете легко обнаружить добавление форм в MDI Form.

Если пометить 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)
{

}

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

Надеюсь, это поможет вам.

1 голос
/ 16 августа 2012

Я понял, что это на много лет позже, однако, поскольку ответы здесь помогли мне решить эту проблему, я хотел бы упомянуть, что это прекрасно работает с использованием массива MdiChildren в .net 4. Единственное, что вам нужно сделать, это проверить, если форма распоряжаться или распоряжаться сообщением о его закрытии.

е:

    private void frmContainer_MdiChildActivate(object sender, EventArgs e)
    {
        tabWindows.RefreshLayout(this.MdiChildren.ToList());
    }

    public void RefreshLayout(List<Form> forms)
    {
        this.nextButtonLeft = 1;
        panel1.Controls.Clear();
        foreach (Form frm in forms)
        {
            if (!(frm.Disposing || frm.IsDisposed)) { addButton(frm); }
        }
    }
0 голосов
/ 31 января 2017

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

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

public class MdiParentForm : Form
{
    // ...

    private Form CreateMdiChildForm()
    {
        var form = new MdiChildForm
        form.ParentChanged += MdiFormParentChangedHandler;
        form.MdiParent = this;
        return form;
    }

    private void MdiFormParentChangedHandler(object sender, EventArgs args)
    {
        var form = sender as Form;
        if (form != null)
        {
            if (form.MdiParent != null)
            {
                // MDI child form will activate
                // ... your code here
            }
            else
            {
                // MDI child form will close
                form.ParentChanged -= MdiFormParentChangedHandler;
                // ... your code here
            }
        }
    }

    // ...
}
0 голосов
/ 25 августа 2016
private void closeToolStripMenuItem1_Click(object sender, EventArgs e)
    {
      List<Form> fm = this.MdiChildren.ToList();
        if(fm!=null && fm.Count>0)
        {
            foreach(Form lfm in fm)
            {
                lfm.Close();
            }
        }
    }
0 голосов
/ 17 января 2013

Недавно я хотел приблизительно определить, когда не было открыто ни одного MDIchildren, чтобы я мог отображать панель с множеством кнопок «что делать» только тогда, когда не было открытых дочерних форм. (просто изучаю идею дизайна).

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

    private void MyForm_MdiChildActivate(object sender, EventArgs e)
    {
        this.panel_Tools.Visible = false;
        if (this.MdiChildren.Count() == 1)
        {
            this.timer_WindowsCounter.Start();
        }
        else
        {
            this.timer_WindowsCounter.Stop();
        }

    }


    private void timer_WindowsCounter_Tick(object sender, EventArgs e)
    {
        if (this.MdiChildren.Count() == 0)
        {
            this.panel_Tools.Visible = true;
            this.timer_WindowsCounter.Stop();
        }
    }
...