Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
11 / 11 / 8
Регистрация: 18.09.2012
Сообщений: 514

Запрет закрытия диалогового окна

09.12.2018, 17:48. Показов 2697. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, как сделать чтобы форма не закрывалась при возникновении исключения в блоке try catch( например неправильный ввод)? Форму открываю при помощи ShowDialog().
Вот как организовано открытие формы.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 if (AM.ShowDialog()==DialogResult.OK)
                {
                    if (AM.textBox1.TextLength != 0)
                    {
                        string comIns = "INSERT INTO spisok_materialov(InvNom,Naim,Cena,KolVo,Stoimost,idNaimOtd,NKab,FIO,NaimAkt) VALUES (@p1,@p2,@p3,@p4,@p5,@p6,@p7,@p8,@p9)";
                        SqlCommand commandIns = new SqlCommand(comIns, connection);
                        commandIns.Parameters.AddWithValue("@p1",AM.textBox1.Text);
                        commandIns.Parameters.AddWithValue("@p2",AM.textBox2.Text);
                        commandIns.Parameters.AddWithValue("@p3", AM.textBox3.Text);
                        commandIns.Parameters.AddWithValue("@p4", AM.numericUpDown1.Value);
                        try
                        {
                            commandIns.Parameters.AddWithValue("@p5", Convert.ToInt32(AM.textBox3.Text) * AM.numericUpDown1.Value);
                        }
                        catch
                        {
                            MessageBox.Show("Ошибка ввода в поле Цена!", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            return;
                        }
                        commandIns.Parameters.AddWithValue("@p6",AM.idOtd);
                        commandIns.Parameters.AddWithValue("@p7",AM.idKab);
                        commandIns.Parameters.AddWithValue("@p8", AM.textBox6.Text);
                        commandIns.Parameters.AddWithValue("@p9", AM.idAkt);
                        commandIns.ExecuteNonQuery();
                        connection.Close();
                        dataGridView1.Rows.Clear();
                        loadData();
                        dataGridView1.CurrentCell= dataGridView1[1, dataGridView1.RowCount - 1];
                    }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.12.2018, 17:48
Ответы с готовыми решениями:

Запрет закрытия формы: готовый код
На событие формы - FormClosing - прописываем следующий код : e.Cancel = true;

Закрытие диалогового окна
Добрый день всем! Как закрыть диалоговое окно при открытии файла и загрузки содержимого в RichTextBox? private void...

Программа для терминала. Запрет закрытия формы
Ни разу не создавал программы для терминала. Сказали, что там стоит обычный комп с экспишкой. Нашлёпать форму для виндовс проблем нет....

11
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18267 / 14190 / 5368
Регистрация: 17.03.2014
Сообщений: 28,879
Записей в блоге: 1
10.12.2018, 11:35
pirat2k, если речь о форме AM, то она уже закрылась. Нужно делать валидацию да закрытия формы в событии FormClosing и отменять закрытие при необходимости.
1
11 / 11 / 8
Регистрация: 18.09.2012
Сообщений: 514
10.12.2018, 18:28  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
если речь о форме AM, то она уже закрылась. Нужно делать валидацию да закрытия формы в событии FormClosing и отменять закрытие при необходимости.
А как правильно сделать валидацию поля "цена"?
Вот код для ограничения ввода символов поля "цена".
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
private void textBox3_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar==',')
            {
                e.KeyChar = '.';
            }
            if (e.KeyChar <'0'|e.KeyChar>'9' && e.KeyChar!=(char)Keys.Back && e.KeyChar!='.')
            {
                e.Handled = true;
            }
            if (textBox3.SelectionStart==0 && e.KeyChar=='.')
            {
                e.Handled = true;
            }
            if (textBox3.Text=="0")
            {
                if (e.KeyChar!='.'&& e.KeyChar!=(char)Keys.Back)
                {
                    e.Handled = true;
                }
            }
            if (e.KeyChar=='.')
            {
                if (textBox3.Text.IndexOf('.')!=-1)
                {
                    e.Handled = true;
                }
            }
            if (textBox3.Text.IndexOf('.') > 0)
            {
                if (textBox3.Text.Substring(textBox3.Text.IndexOf('.')).Length > 2)
                {
                    if (e.KeyChar != (char)Keys.Back)
                    {
                        e.Handled = true;
                    }
                }
            }
        }
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18267 / 14190 / 5368
Регистрация: 17.03.2014
Сообщений: 28,879
Записей в блоге: 1
10.12.2018, 21:13
pirat2k, если уже есть проверка вводимых символов, то этого должно быть достаточно. Советую только проверить что вставка из буфера обмена корректно обрабатывается. Далее судя по коду цена это дробное число, а ты используешь Convert.ToInt32(). Надо определиться с типом данных для цены. И если это дробный тип, то не забыть передать правильную культуру методу парсинга.
0
11 / 11 / 8
Регистрация: 18.09.2012
Сообщений: 514
11.12.2018, 15:00  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
если уже есть проверка вводимых символов, то этого должно быть достаточно. Советую только проверить что вставка из буфера обмена корректно обрабатывается. Далее судя по коду цена это дробное число, а ты используешь Convert.ToInt32(). Надо определиться с типом данных для цены. И если это дробный тип, то не забыть передать правильную культуру методу парсинга.
Ну если допустим пользователь введет 3. то это не допустимо. А вот как делать чтобы он выбивал ошибку и форма не закрывалась либо кнопка "Добавить" была не активна тогда?
0
548 / 355 / 120
Регистрация: 17.08.2014
Сообщений: 1,351
11.12.2018, 15:13
pirat2k, у текстбокса есть метод валидации. зачем вы пытаетесь ограничить ввод запятой и выставить точку? для конвертации в Decimal? тогда при смене локали на другую где разделитель запятая у вас будет выбивать ошибку потому что разделитель для локали запятая. ограничивайте ввод букв в поле а разделитель может быть вообще не введен. Соответственно вы проверяете при вводе что символы цифра и разделитель только 1. а далее при валидации если разделителя нет то добавляете разделитель и нужное число дробных разрядов. Если разделитель есть смотрите в каком он месте если он первый то перед разделитем добавляете 0, если количество дробных разрядов меньше нужного добавляете нули до нужного количества разрядов. Если количество дробных разрядов больше нужного то усекаете количество дробных разрядов до нужного количества. далее если валидация успешна кнопка добавить активна. если валидация не успешна то кнопка не активна.
0
11 / 11 / 8
Регистрация: 18.09.2012
Сообщений: 514
11.12.2018, 20:21  [ТС]
Пытаюсь сделать так, но разделитель вообще не выводится
C#
1
2
3
4
if (e.KeyChar < '0' | e.KeyChar > '9' && e.KeyChar != (char)Keys.Back && e.KeyChar != (char)Keys.Decimal)
            {
                e.Handled = true;
            }
Добавлено через 24 минуты
Цитата Сообщение от Andreyip Посмотреть сообщение
далее при валидации если разделителя нет то добавляете разделитель и нужное число дробных разрядов. Если разделитель есть смотрите в каком он месте если он первый то перед разделитем добавляете 0, если количество дробных разрядов меньше нужного добавляете нули до нужного количества разрядов. Если количество дробных разрядов больше нужного то усекаете количество дробных разрядов до нужного количества. далее если валидация успешна кнопка добавить активна. если валидация не успешна то кнопка не активна.
Это уже сложновато для меня!
0
548 / 355 / 120
Регистрация: 17.08.2014
Сообщений: 1,351
12.12.2018, 09:00
Примерно как то так.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
    private void textBox1_Validating(object sender, CancelEventArgs e)
        {
            if (sender is TextBox)
            {
                var decimalcount = 2;//сколько разрядов нужно
                var textbox = (sender as TextBox);
             
               
                decimal d = 0;
                //парсим в зависимости от культуры
                if (!Decimal.TryParse(textbox.Text,NumberStyles.Any,Thread.CurrentThread.CurrentCulture, out d))
                {
                    e.Cancel = true; return;
 
                }
                //если все ок то выводим все в текстбокс
             textbox.Text  = d.ToString("N" + decimalcount);
 
            }
            else e.Cancel = true;
 
            
        }
        private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (sender is TextBox)
            {
                var c = Convert.ToChar(Thread.CurrentThread.CurrentCulture.NumberFormat.NumberDecimalSeparator);
                
                if (c == e.KeyChar)
                {
                    if ((sender as TextBox).Text.Contains(c))
                    {
                        e.Handled = true;
                    }
                }
 
                else if (!char.IsDigit(e.KeyChar) && e.KeyChar != (char)Keys.Back)
                {
                    e.Handled = true;
                }
            }
           else e.Handled = true;
        }
1
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
12.12.2018, 09:42
pirat2k, зачем Вам эти все извращения для работы с числами если есть контрол NumericUpDown который изначально уже работает так как надо Вам + в настройках ему можно дать вывод плавающей точки и числа знаков после запятой в Вашем случае думаю это должно быть 2 если после запятой это число "копеек" или 0 если копейки не предусмотрены.
0
548 / 355 / 120
Регистрация: 17.08.2014
Сообщений: 1,351
12.12.2018, 10:08
SeIZVeIZ, каждый делает как хочет NumericUpDown не панацея. с учетом не отключаемых штатно кнопок и указанием минимального и максимального числа.
0
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
12.12.2018, 17:05
Andreyip, в текущей ситуации что нужно ТС, это самый верный и быстрый вариант без запары. А между заполнением 2 свойств или писаниной своего кастылявалидатора на уже существующей лучше выбрать 1.

P.S. Хозяин барин и никто не заставляет. Вопрос был из разряда что ТС может и не знать что такое есть, или не обратить внимание на такую вещь.
1
11 / 11 / 8
Регистрация: 18.09.2012
Сообщений: 514
13.12.2018, 19:01  [ТС]
Цитата Сообщение от SeIZVeIZ Посмотреть сообщение
в текущей ситуации что нужно ТС, это самый верный и быстрый вариант без запары. А между заполнением 2 свойств или писаниной своего кастылявалидатора на уже существующей лучше выбрать 1.
А так можно было? Действительно не знал. Буду на будущее знать!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.12.2018, 19:01
Помогаю со студенческими работами здесь

Исключение связанное с вызовом диалогового окна
Помогите исправить исключение: в экзэмпляре объекта не задана ссылка на объект downloader dwnld_sdk = new downloader(); ...

Добавить фото из диалогового окна в ListBox
Добрый день! Помогите, пожалуйста, нужно добавить фото из диалогового окна в ListBox (у него должно быть два столбца (описание, титульный...

Поиск диалогового окна
Открываю WinRAR. Пробую разархивировать. Появляется окно &quot;Ввод пароля&quot;. Теперь объясняю. Хочу написать брут. Окно это открывается не...

Печать фотографии без диалогового окна
Здравствуйте, подскажите возможно ли напечатать фотографию/документ без диалогового окна? и как это сделать? просто задача стоит на...

При закрытии диалогового окна закрывается и форма
Всем доброго времени суток. Есть форма(аля авторизация) и диалоговое сообщение при закрытии формы (вы не ввели Л и П, программа будет...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
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 и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru