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, этот подход повлияет на производительность и объем памяти.

Вместо этого я подготовил бы список всех динамически добавленных элементов управления и удалил их один за другим. Во-вторых, я бы написал процедуру сброса фиксированных элементов управления к их начальному значению, не удаляя их из коллекции элементов управления и не читая их снова и снова.

Другие вопросы по тегам