2012-06-25 4 views
2

Я запускаю форму из другой формы. Я хочу, чтобы родительская форма, чтобы быть утилизирована перед показом подчиненного, поэтому я использую: отображаютсяИспользование формы.ShowDialog() после этого. Dispose();

this.Dispose(); 
form.ShowDialog(); 

формы, это правильный способ сделать это? Форма из запускается по вызову ShowDialog() из основной формы. Я хочу, чтобы эти формы были закрыты до того, как основная форма будет доступна для редактирования.

EDIT: 

Это основной процесс

MainForm> (ShowDialog)> Form1> (утилизирует + ShowDialog)> form2 (утилизацию)> MainForm

+0

это. Спрятать(); форма.ShowDialog(); – Alex

ответ

3

Если вы хотите, чтобы родитель не виден перед ребенком показывается, и вы хотите, родитель Закрыть:

var f = new ChildForm(); 
this.Hide(); 
f.Show(); 
this.Close(); 

ShowDialog() средства, «показать эту форму и возвращение мне после его закрыто". Это не то, что вы описали, что хотите.

Основываясь на ваших комментариях, может возникнуть смысл создавать и показывать форму2 из вашей основной формы.

В основной форме:

DialogResult form1Result; 
    using (var f = new Form1()) 
    { 
     form1Result = f.ShowDialog(); 
    } 
    if (form1Result == DialogResult.OK) 
    { 
     using (var f2 = new Form2()) 
     { 
      f2.ShowDialog(); 
     } 
    } 

И в Form1 случае, когда вы изначально породившего Form2

this.DialogResult = DialogResult.OK; 
this.Close(); 
+0

Спасибо. Мой подход работает отлично, без каких-либо проблем, есть ли необходимость в этом дополнительном коде. – techno

+0

* Ваш намерение * вашего кода не определяется выбранными вами методами. Да, это может сработать, но когда вы читаете 'ShowDialog()', есть определенное ожидание поведения. Остальные две строки кода никак не повлияют на производительность. – hometoast

+0

Mainform> (Showdialog)> form1> (dipose + showDialog)> form2 (dipose)> Mainform – techno

2

Вызов Dispose на любой объект (включая текущий объект, известный как this) говорит, что вы закончили с этим объектом, он окончательно закончен.

Лучше, чем Close Первый диалог, а затем показать второй.

+0

Приведите пример. Будут освобождены ресурсы, если я использую close. – techno

+0

@techno Вероятно, нет, это зависит от деталей, которые вы не дали. По дальнейшим соображениям вы, вероятно, будете лучше реорганизовать свой код, чтобы иметь контрольный компонент, который показывает первую форму, а затем вторую. Затем он может располагать первую форму, когда она закрыта. – Richard

+0

Подход «Закрыть» не работает, старая форма не закрыта, она присутствует в фоновом режиме – techno

0

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

Я думаю, вам нужно вызвать метод «Показать», после чего вы можете вызвать метод dispose.

+0

Это не будет работать, форма не будет закрыта – techno

+0

Я создал 2 form2 и добавил этот код: Form3 f = new Form3(); this.Dispose(); f.Show(); , и все работает отлично, возможно, в вашем приложении есть другие проблемы, что происходит при запуске приложения? –

0

Жизненный цикл дочерней формы, зависит от его родительского жизненного цикла, что означает, как только вы вызовите parent.close родительской формы, он будет уничтожать все объекты, созданные этим экземпляром.

Вы должны создать ребенка независимо от родителя.

1

Если вы показываете дочерний диалог модально (в этом случае вы находитесь), вы можете скрыть родительский диалог. Что вы можете сделать, это скрыть родительскую форму, показать дочернюю форму и затем закрыть родительскую форму.

var form = new SomeForm(); 
this.Hide(); 
form.ShowDialog(); // the code will be blocked at this point until the child form closes 
this.Close(); 
this.Dispose(); // i'm not sure if this is necessary anymore. check MSDN 

Если вы показываете форму (не модальна), вы можете скрыть родительскую форму, и слушать близко событие дочерней формы, а затем закрыть родительскую форму в обработчике

void childFormClosed(Event e) 
{ 
    this.Close(); 
} 

var form = new SomeForm(); 
form.Closed += new EventHandler... // I usually rely on intellisense with this 
this.Hide(); 
form.ShowDialog(); 
+0

Его хорошо, но в первом случае нет необходимости в этом. Close(); – techno

+0

Я не уверен, что вы хотите вызвать Dispose вручную. Обычно я предпочитаю Close и позволяю фреймворку автоматически запускать Dispose. –

Смежные вопросы