Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.97/103: Рейтинг темы: голосов - 103, средняя оценка - 4.97
24 / 24 / 18
Регистрация: 11.03.2012
Сообщений: 175

Отмена события закрытия формы Form.Closed()

15.02.2015, 21:59. Показов 22189. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собственно, проблема исходит из следующего:
При закрытии формы вызываю MessageBox с вариантами Да/Нет.
C#
1
2
3
4
5
6
7
        private void Test_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (MessageBox.Show("Хотите закончить тест не пройдя его полностью ?", "Внимание!", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes)
            {
                //код
            }
         }
При нажатии на кнопку "Да" происходит выполнение кода, затем MessageBox снова появляется с этими же вариантами и повторное нажатие на "Да" повторяет выполнение кода (работаю с БД, поэтому он мне делает 2 записи в неё), после чего форма закрывается.
При нажатии на кнопку "Нет", т.е. под ней подразумевается отмена закрытия формы, форма всё равно закрывается.
Вопрос: как избежать повторного появления MessageBox (чтобы исключить повторные записи) и как отменить закрытие формы ? Может быть можно как-то иначе решить эту проблему ?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.02.2015, 21:59
Ответы с готовыми решениями:

Переопределение события закрытия формы
В проекте есть форма, при ее закрытии мне необходимо сохранить все изменения, сделанные пользователем. Но как переопределить нажатие...

Проаблема с обработкой события закрытия формы
Не могу обработать событие при закрытии формы нажатием на "Х" (крестик). пишу MainForm.FormClosing для вызова обработчика void...

Отмена обработчика события
Я разрабатываю калькулятор (все через это прошли наверно). Когда я в поле для ввода ввожу цифру на это событие (textChanged) реагирует...

13
116 / 116 / 42
Регистрация: 27.02.2013
Сообщений: 899
15.02.2015, 22:10
FallenAngel76ru, зачем ты это все в условие засунул? вынеси messagebox с условия. а в условии пропиши dialogresult
0
24 / 24 / 18
Регистрация: 11.03.2012
Сообщений: 175
15.02.2015, 22:18  [ТС]
Окей, попробую, но позже.
А отмену закрытия при нажатии на "Нет" тогда как сделать ?
0
 Аватар для Metall_Version
2152 / 1289 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
15.02.2015, 22:21
Цитата Сообщение от blackstar Посмотреть сообщение
зачем ты это все в условие засунул?
а в чем проблема?

FallenAngel76ru, нужно обрабатывать событие FormClosing, ибо оно происходит перед закрытием, а то что ты используешь FormClosed оно происходит после закрытия

C#
1
2
3
4
5
6
7
        private void Test_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (MessageBox.Show("Хотите закончить тест не пройдя его полностью ?", "Внимание!", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes)
            {
                e.Cancel = true; // отменяем закрытие формы
            }
         }
Добавлено через 1 минуту
или проще
C#
1
2
3
4
5
        private void Test_FormClosing(object sender, FormClosingEventArgs e)
        {
            var dr = MessageBox.Show("Хотите закончить тест не пройдя его полностью ?", "Внимание!", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
            e.Cancel = dr == DialogResult.Yes; // отменяем закрытие формы если нажали да
         }
3
24 / 24 / 18
Регистрация: 11.03.2012
Сообщений: 175
15.02.2015, 22:22  [ТС]
Я по-ходу лажанул сам..) Щас исправлюсь.
При вызове FormClosed() он при выборе "Да" нормально записывает одну запись, а при FormClosing() он выкидывает MessageBox 2 раза, тем самым делая 2 записи.
И надо наоборот: если нажали "Да" - форму закрыть, если нажали "Нет" - оставить форму открытой. Но проблема с нажатием "Да" написана выше.
0
 Аватар для Metall_Version
2152 / 1289 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
15.02.2015, 22:42
FallenAngel76ru, забыл напомнить про closingReason

C#
1
2
3
4
5
6
7
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if(e.CloseReason!=CloseReason.UserClosing) return;
 
            var dr = MessageBox.Show("Хотите закончить тест не пройдя его полностью ?", "Внимание!", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
            e.Cancel = dr == DialogResult.No; // отменяем закрытие формы если нажали да
        }
0
24 / 24 / 18
Регистрация: 11.03.2012
Сообщений: 175
15.02.2015, 22:54  [ТС]
CloseReason - Насколько я понял, если пользователь пытается закрыть программу другими путями (т.е. не на крестик). Тогда этот перехват тоже надо сделать..
Просто объясню смысл. Пользователь проходит тест. Если он не дошел его до конца, а решил закрыть и пробежаться заново, то ему это надо запретить, для этого сделав в базу запись о том, что он тест уже проходил, хоть и не дошёл до конца. Вот и нужно обработать закрытие формы.
Т.о получается следующее:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        private void Test_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (MessageBox.Show("Хотите закончить тест не пройдя его полностью ?", "Внимание!", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes && e.CloseReason!=CloseReason.UserClosing)
            {
                using (SqlConnection connection = new SqlConnection(stroka))
                {
                    connection.Open();
                    SqlCommand cmd_write_result = new SqlCommand("INSERT INTO Result(StudentsID, TestID, CorrectReply, All_Questions, Rating) Values(@id_Student, " + Test_Data.test_ID + ", @correct, " + id_Questions.Count + ", @rating)", connection);
                    cmd_write_result.Parameters.Add("@id_Student", SqlDbType.Int);
                    cmd_write_result.Parameters["@id_Student"].Value = id_Student;
                    cmd_write_result.ExecuteNonQuery();
                }
            }
            else
            {
                 e.Cancel = true;
            }
        }
Типа такого ?

Upd. Не, хрень какая-то.. Так у меня выкидывает 2 раза MessageBox и делает 2 записи, о чём я и писал ранее.
0
 Аватар для Metall_Version
2152 / 1289 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
15.02.2015, 23:33
Цитата Сообщение от FallenAngel76ru Посмотреть сообщение
Просто объясню смысл. Пользователь проходит тест. Если он не дошел его до конца, а решил закрыть и пробежаться заново
изначально не верный подход, не нужно пытаться найти тот самый момент когда он решил не проходит тест.
а нужно просто знать прошел он его или нет, то есть если прошел до конца то ставим "галочку" где то у нас в базе..

ибо самое простое что можно сделать - вырубить комп, и никакой мего умный код по отлавливанию не поможет..
0
24 / 24 / 18
Регистрация: 11.03.2012
Сообщений: 175
15.02.2015, 23:41  [ТС]
Ну, комп вырубать - никто не вырубит. Себе дороже будет, ибо время тикает.
А это сделать нужно, ибо надо защитить от простого "тыканья" вопросов с целью повторного перепрохождения.
Конечный результат уже сделан(запись в базу при полном прохождении), а вот такую хрень не могу никак сделать.
0
 Аватар для Metall_Version
2152 / 1289 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
15.02.2015, 23:55
Цитата Сообщение от FallenAngel76ru Посмотреть сообщение
Ну, комп вырубать - никто не вырубит. Себе дороже будет, ибо время тикает.
А это сделать нужно, ибо надо защитить от простого "тыканья" вопросов с целью повторного перепрохождения.
Конечный результат уже сделан(запись в базу при полном прохождении), а вот такую хрень не могу никак сделать.
второй раз не буду повторять, это не верный подход.

мы должны только считать количество попыток пройти тест, и количество сколько раз тест прошли,

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

еще можно поставить ограничение на время, то есть например можно проходить не чаще трех раз в сутки.
0
 Аватар для Евгений В
912 / 672 / 134
Регистрация: 01.03.2010
Сообщений: 1,279
16.02.2015, 00:38
FallenAngel76ru,

Так форму можно открыть на весь экран. Безо всяких управляющих значков на форме и меню снизу Windows.
C#
1
2
            this.FormBorderStyle = FormBorderStyle.None ;
            this.WindowState = FormWindowState.Maximized;
Остается проблема нажатия Ctrl -alt -del для вызова диспетчера задач.

Но, вроде в реестре HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Wi ndows NT\CurrentVersion\Winlogon поставить DisableCAD значение 0.
Тут я не буду утверждать наверняка.
1
24 / 24 / 18
Регистрация: 11.03.2012
Сообщений: 175
16.02.2015, 00:42  [ТС]
Диспетчер по умолчанию отключен для обычного пользователя. Поэтому через него снять задачу будет невозможно.
Так же программа будет стоять на XP, и там в панели задач вроде как нет контекстного меню "Закрыть" для открытого приложения..сработает только Alt + F4 в принципе..
А так да..спасибо за идею с BorderStyle..) не подумал как-то даже (:
0
1 / 1 / 0
Регистрация: 22.07.2019
Сообщений: 39
01.01.2020, 22:33
Чтобы messagebox не выскакивал 2 раза используйте это
C#
1
Application.ExitThread();
Именно Thread
0
1167 / 885 / 517
Регистрация: 09.04.2014
Сообщений: 2,098
03.01.2020, 17:25
Цитата Сообщение от FallenAngel76ru Посмотреть сообщение
а при FormClosing() он выкидывает MessageBox 2 раза, тем самым делая 2 записи.
значит вы дважды подписались на одно и то же событие - поисчите в коде ссылки на Test_FormClosing
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.01.2020, 17:25
Помогаю со студенческими работами здесь

Отмена закрытия формы
Можно ли как либо в коде формы обработать и отменить событие Form_Close()? Например нажатие на крестик в левом верхнем углу?

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

Как отменить выполнение функции? Отмена закрытия формы.
У меня возникла проблема, которую не получается нагуглить. Когда пользователь нажимает крестик на форме, он закрывается, а событие...

Отмена закрытия формы при отмене сохранения книги
Подскажите форма при закрытии которой она прячет пару листов и предложит сохранить данные, но если при сохранении нажать отмену, то формы...

Обработка события закрытия формы
Есть две формы. Нужно чтобы при нажатии на крестик в углу одной она закрывалась и открывалась вторая форма. Подскажите плиз событие или...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
ПЛИС
zxcha1ka_ 27.01.2026
AHDL Разработать программы для синтеза следующих устройств: 1. Параллельного регистра 4-х разрядного с синхронной загрузкой и асинхронным сбросом (обнулением); Пoмoгитe пoжaлyйстa
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru