C# Удалить диалоговое окно результата
Как я могу удалить объект DialogResult? Я использую его в качестве подтверждения для очистки формы (удаление всех элементов управления и повторная инициализация элементов управления). Проблема в том, что когда я нажимаю "да", он воссоздает второй DialogResult, затем третий, затем четвертый и т. Д.
ТАК, когда пользователь нажимает да, я хотел бы удалить этот DialogResult. Есть ли способ?
Код здесь:
private void GUI_DCP_FormClosing(object sender, FormClosingEventArgs e)
{
var confirmation_text = "If you click 'Yes', all information will be discarded and form reset. If you want to save the input click 'No' and then 'Save'";
DialogResult dialogResult = MessageBox.Show(confirmation_text, "WARNING", MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.Yes)
{
this.Hide();
e.Cancel = true; // this cancels the close event.
this.Controls.Clear();
this.InitializeComponent();
this.Height = 278;
this.Width = 341;
}
else
{
e.Cancel = true;
}
}
1 ответ
Когда вы вызываете InitializeComponent, вы не только добавляете свои элементы управления ex-novo, но также повторно добавляете все обработчики событий, ВКЛЮЧАЯ обработчики событий, связанные с самой формой (событие FormClosing и другие, если они есть).
Таким образом, первый вызов, кажется, идет хорошо, но он регистрирует обработчик события FormClosing во второй раз. Таким образом, когда вы запускаете действие, которое входит в обработчик события FormClosing, оно вызывается два раза, и в одном и том же вызове оно будет зарегистрировано снова, и в следующий раз вызов будет выполнен три раза и так далее.
Самым простым способом остановить это поведение является удаление обработчика события FormClosing перед вызовом InitializeComponent.
if (dialogResult == DialogResult.Yes)
{
this.Hide();
e.Cancel = true;
// This removes the FormClosing event handler.
// If other event handlers are present you should remove them also.
this.FormClosing -= GUI_DCP_FormClosing;
this.Controls.Clear();
this.InitializeComponent();
this.Height = 278;
this.Width = 341;
// Do not forget to reshow your hidden form now.
this.Show();
}
Но я действительно не думаю, что это хорошая идея, чтобы очистить коллекцию элементов управления и снова вызвать InitializeComponent.
Помимо того, что если у вас есть много обработчиков событий, вы должны удалить их все перед вызовом InitializeComponent, этот подход повлияет на производительность и объем памяти.
Вместо этого я подготовил бы список всех динамически добавленных элементов управления и удалил их один за другим. Во-вторых, я бы написал процедуру сброса фиксированных элементов управления к их начальному значению, не удаляя их из коллекции элементов управления и не читая их снова и снова.