2014-06-13 3 views
0

Я сталкиваюсь странное поведение с моей WinForms приложение в VS 2010. Я запускаю новую форму, используя прямолинейный код:WinForm закрывается даже после удаления Close()

MainDisplayForm.cs:

using (MyForm myForm = new MyForm()) 
{ 
    var result = myForm.ShowDialog(); 
    if (result == DialogResult.OK) 
    { 
     // do stuff 
    } 
} 

Я добавил кнопку «Отмена» в MyForm, которая отобразила для пользователя подтверждение MessageBox, а затем вызвало this.Close(). Я позже удалил строку this.Close(), потому что я добавил выделенную кнопку Закрыть. Однако всякий раз, когда я нажимаю Отменить, экземпляр MyForm все еще закрывается!

MyForm.cs:

private void cmdCancel_Click(object sender, EventArgs e) 
{ 
    DialogResult result = MessageBox.Show(...) 
    // clear the form if user really wants to quit 

    // this.Close() 
    // even after removing the above line, program still jumps to FormClosing 
} 

Когда я отлаживать линию за линией после нажатия на кнопку Отмена, поток программа просто переходит к MyForm_FormClosing после того, как попадает в конец cmdCancel_Click. Я создал новую кнопку и установил ее событие click на cmdCancel_Click, и он не закрыл форму - поэтому проблема решена, но мне все еще интересно, это просто ошибка или что-то еще? Я также позаботился о том, чтобы вернуть свойство DialogResult моей кнопки «Отмена» обратно до None (после изменения его на Cancel, прежде чем я представила специальную кнопку «Закрыть»).

+0

Вы случайно установили свойство cancelbutton формы в cmdCancel? – terrybozzio

+0

Что такое значение свойства DialogResult для кнопки? – hatchet

+0

@terrybozzio Я тоже избавился от этого. У меня есть еще одна кнопка «Сохранить», которая испытывает ту же проблему. Оба имеют 'this.Close()', и оба продолжают закрывать форму даже после того, как я удалил ее. – valsidalv

ответ

1

Когда вы покидаете область действия 'using', он вызывает 'myForm.Dispose()' (вот и вся цель 'using' - для вызова Dispose(). Это, в свою очередь, уничтожает экземпляр myForm, включая закрытие окна.

+0

Но он использует ShowDialog. Он не выйдет из блока до завершения диалога. – hatchet

+0

да ваше право конечно, но внутри оператора using форма показана модально и ждать результата диалога, который в этом случае OP удаляет close() внутри обработчика кнопки, не указывая на закрытие формы. – terrybozzio

+0

Я не уверен, что понимаю, или, может быть, я сформулировал это неоднозначно. 'cmdCancel_click' - это метод в MyForm. Когда он заканчивается, он вызывает «MyForm_FormClosing», который закрывает форму и возвращается к оператору 'using', который у меня есть в моем первом списке кода. Мой вопрос в том, почему он называет 'MyForm_FormClosing' вообще. Это все происходит, прежде чем выйти из объема инструкции 'using'. Я обновил свой код, надеюсь, будет немного яснее. – valsidalv

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