#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, она не должна зацикливаться