Зачем формировать цикл, вызывающий замыкание

#c# #winforms

Вопрос:

У меня есть ресторан POS, на экране продаж я создаю новый счет-фактуру при загрузке формы, и при закрытии я удаляю текущий счет-фактуру, если в счет-фактуру не вставлены товары, но если есть товары, я спрашиваю пользователя, действительно ли он уверен, что хочет закрыть счет-фактуру и отменить счет-фактуру, если да, я удаляю счет-фактуру, если нет, я сохраняю его на экране продаж. в закрытой форме я проверил тип пользователя, если он сотрудник, я закрываю все приложение, а если администратор, я обычно закрываю форму, чтобы он мог вернуться к домашней форме

но при закрытии формы код выполнялся 2 раза, и я не мог понять, почему, зная, что код повторяется бесконечно, но я улучшил код, но он все еще выполняется 2 раза.

вот мой код:

  private void Sales_screen_FormClosed(object sender, FormClosedEventArgs e)
    {
        DBConn.Delete("Delete from invoices where ID=@ID", CommandType.Text, new SqlParameter[] { new SqlParameter("@ID", INVOICEID.ToString()) });
        if (Curent_user.Utype == "employee")
        {
            try
            {
                Environment.Exit(0);
            }
            catch (Exception)
            {
            }
        }
        else
        {
            Close();
            Dispose();
            GC.Collect();
            GC.WaitForPendingFinalizers();
        }
    }

    private void Sales_screen_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (GV.Rows.Count > 0)
        {
            var result = CmessageBox.ShowDialog(this, "confirmation", "are you sure you want to close the invoice؟");
            if (result != DialogResult.Yes)
            {
                e.Cancel = true;
            }
        }
    }
 

Комментарии:

1. Вы пытались удалить свой Close() внутри вашего else?

2. Почему Close / Dispose /два GC вызова в вашем FormClosed обработчике. Форма уже закрыта. Возможно GC.Collect , вызов имеет смысл, но WaitForPendingFinalizers он просто заморозит ваш пользовательский интерфейс.

3. @MarcRoussel, оперативники !! Я тупой, это так очевидно. Спасибо.

4. @Flydog57 итак, куда мне следует позвонить, чтобы избавиться?? потому что я использую диалоговое окно «Показать», и форму нужно удалить при закрытии.

5. Если вы открыли эту форму как диалоговое окно, строка после ShowDialog() ; или объявите форму с using помощью инструкции, чтобы она автоматически удалялась. — Удалите все из этого else { } блока и из этого пустого catch { } блока.

Ответ №1:

Удалив строку Close() в поле else, она не должна зацикливаться