2013-06-04 2 views
0

У меня есть MdiParent, который открывает несколько экземпляров формы в качестве своих MdiChildren. Когда каждая форма открывается, я вызываю this.LayoutMdi(MdiLayout.TileHorizontal);, чтобы выложить все формы.Макет оставшихся форм при закрытии формы

Я хочу сделать то же самое, когда форма закрывается, но я не могу это сделать в обработчиках событий FormClosing или FormClosed MdiChildren, поскольку она все еще включает закрытую форму при оформлении форм (хотя это не показаны)

Любые идеи о том, как добиться этого, возможно, в MdiParent?

+0

Это сообщение может помочь: http://stackoverflow.com/questions/538204/mdi-form-detecting-with-a-child-form-is-added-or-deleted –

ответ

1

Следите за детьми в виде MdiParent, а затем подключить вверх Disposed обработчик:

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

protected override void OnMdiChildActivate(EventArgs e) 
{ 
    base.OnMdiChildActivate(e); 

    Form f = ActiveMdiChild; 
    if (f == null) 
     return; 
    else 
    { 
     if (!_childForms.Contains(f)) 
     { 
      _childForms.Add(f); 
      f.Disposed += new EventHandler(childForm_Disposed); 
     } 
    } 
} 

private void childForm_Disposed(Object sender, EventArgs e) 
{ 
    _childForms.Remove((Form)sender); 
    this.LayoutMdi(MdiLayout.TileHorizontal); 
} 
+0

Спасибо, я не знал, что вы можете связать событие дочерней формы с обработчиком в родительской форме. – ashishduh

+0

@ user1199931 Как только у вас есть ссылка на форму, вы можете сделать с ней много всего. – DonBoitnott

1

мне нравится @ ответ DonBoitnott в. Если вы хотите, чтобы придерживаться случае FormClosed(), однако, просто Dispose() формы перед вызовом LayoutMdi():

void frm_FormClosed(object sender, FormClosedEventArgs e) 
    { 
     Form frm = (Form)sender; 
     // ... possibly do something with "frm" BEFORE it's disposed of ... 
     frm.Dispose(); 

     this.LayoutMdi(MdiLayout.TileHorizontal); 
    } 
Смежные вопросы