Закрыть форму windows forms c

Обновлено: 06.07.2024

KeyPreview в моих свойствах формы Windows Forms имеет значение true . Что я делаю не так?

Вы пробовали установить точку останова в этих методах? Срабатывает ли обработчик событий? Не называйте кнопку отмены так, как свойство формы «CancelButton». В противном случае кажется, что вы не можете установить CancelButton. @SteveDanner, событие не запускается. вероятно, объявление в InitializeComponent () отсутствует. Я думаю, что причина, по которой это не работает, заключается в том, что другие элементы управления внутри формы получили фокус .

Это всегда будет работать, независимо от правильного назначения обработчика событий KeyPreview и CancelButton т. Д.

-1, использование свойства CancelButton формы является правильным. Ух, звонили 80-е, они хотят вернуть свое диалоговое окно. Вы также можете вернуться true из, ProcessCmdKey чтобы подать сигнал о том, что клавиша обработана, тем самым предотвращая шум "дина". Вы можете использовать свойство CancelButton формы только в том случае, если на форме есть настоящая кнопка (или интерфейсный объект IButtonControl). Этот вариант хорош. Для CancelButton требуется дополнительная видимая кнопка «Отмена» в форме. Это избыточный рендер + код + и т. Д.

Вы должны просто установить CancelButton свойство формы для кнопки «Отмена», и тогда вам не понадобится никакой код.

Я сделал это, но он не запускается, когда я нажимаю esc, почему? Это отлично сработало для меня. Намного лучше для малых форм.

Предполагая, что у вас есть кнопка «Отмена», установка CancelButton свойства формы (в дизайнере или в коде) должна позаботиться об этом автоматически. Просто поместите код, чтобы закрыть в Click случае нажатия кнопки.

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

После отладки я обнаружил, что один из элементов управления моей формы был переопределяющим ProcessCmdKey методом с помощью этого кода:

. и это мешало моей форме получить ESC ключ (обратите внимание на return true ). Поэтому убедитесь, что никакие дочерние элементы управления не перехватывают ваш ввод.

Кажется, я столкнулся с этой проблемой с элементами управления ListView в моей winform. Интересно, не в ListView ли вы тоже заметили проблему?

Вы устанавливаете для KeyPreview значение true в параметрах формы, а затем добавляете к нему событие Keypress. В событии нажатия клавиш вы вводите следующее:

Ok, поэтому класс Windows Forms, WindowSettings и форма имеют кнопку "Отмена". Когда пользователь нажмет кнопку, появится диалоговое окно DialogSettingsCancel и спросит пользователя, уверен ли он, что хочет выполнить действие. Диалог имеет 2 кнопки, кнопку"Да "и кнопку"Нет". Если пользователь нажимает кнопку "Да", я хочу, чтобы оба DialogSettingsCancel и WindowSettings были закрыты.

мой обработчик событий button_Click в DialogSettingsCancel:

когда я запускаю свое приложение, и перейдите в форму настройки, и нажмите кнопку "Отмена"-кнопка, а затем нажмите кнопку "Да"-кнопка, только DialogSettingsCancel закрывается без закрытия WindowSettings.

почему это не работает?

Я также пытался изменить

но все тот же результат.

вам нужен фактический экземпляр WindowSettings это открыто, а не новое.

в настоящее время, вы создаете новый экземпляр WindowSettings , а вызов Close об этом. Это ничего не делает, потому что этот новый экземпляр никогда не был показан.

вместо этого, при показе DialogSettingsCancel установите текущий экземпляр WindowSettings как родитель.

что-то вроде этого:

этот подход учитывает, что a DialogSettingsCancel потенциально может быть открыт без WindowsSettings как родитель.

если они всегда связаны, вы должны вместо этого использовать параметр конструктора:

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

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

почему бы не использовать метод DialogResult для закрытия формы?

для этого вам нужно будет сделать это внутри формы "WindowSettings" при вызове формы DialogSettingsCancel. Точно так же вы могли бы вызвать OpenFileDialog или любую другую диалоговую форму.

закрытие экземпляра окна настроек сразу после его создания. Сначала вам нужно отобразить окно настроек, а затем дождаться результата диалога. Если он возвращается как отмененный, закройте окно. Например:

В чём же причина такого поведения? Об этом расскажу дальше. Рассмотрим открытие и закрытие форм на примерах.

Открываем и закрываем форму из другой формы

Чтобы открыть Form2 нам необходим следующий код, который будет срабатывать при нажатии на кнопку:

Теперь у нас открылась Form2 и спряталась Form1. Поработав с Form2 мы её закрываем и при этом нам надо после этого отобразить Form1. Многие начинающие, включая меня начинают писать следующий код, который помещаем в событие, которое происходит после закрытия Form2:

Вроде всё логично: Form2 закрылась, Form1 открылась. Однако используя этот метод, мы можем заметить, что после того как мы закрываем приложение оно продолжает висеть в памяти. Многие, не зная почему это происходит дописывают в метод «Form1_FormClosed» дописывают принудительное закрытие приложения:

Это работает, однако правильно ли это? Решать вам.

А теперь ответим на вопрос «почему приложение висит в памяти» и рассмотрим простое и правильное решение.

Первая часть кода: мы отображаем Form2 и скрываем Form1. Не закрываем, а именно скрываем, т.е. экземпляр Form1 продолжает существовать.

Закрыть Form1 вместо скрытия не получится, так как это главная форма приложения и при её закрытии мы закроем всё приложение.

Вторая часть кода: строкой «Form ifrm = new Form1();» мы создаём второй экземпляр Form1 и далее его и отображаем, а первый экземпляр Form1 продолжает жить в памяти. И когда мы закрываем приложение (Form1), то первый экземпляр при этом не закрываем он так и «сидит» в памяти, поэтому приложение не выгружается из памяти. В связи с этим многие и закрывают принудительно приложение при закрытии главной формы (Form1).

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

Теперь при закрытии Form2 у нас будет вызываться и отображаться та форма, которая породила закрывающуюся.

Учитываем координаты форм при открытии

Представьте ситуацию. Открыта Form1 вы её перемещаете в правый верхний угол экрана. Потом нажимаете на кнопку и… Form2 открывается по центру экрана или в другом месте, но не в том месте, где была Form1. Многие улыбнуться и скажут, что в свойствах Form2 надо прописать/указать следующее «StartPosition -> CenterParent» и открывать Form2 следующим методом:

Form ifrm = new Form2();
ifrm.ShowDialog();

Это правильное решение, которое всегда будет открывать Form2 поверх Form1 и всегда по центру Form1. Однако этот код не применим, если вам надо скрывать Form1, так как Form1 не будет скрываться.

Сейчас приведу полное решение, которое позволит открывать Form1 и Form2 в той же точке, где находилась до этого форма, вызывающая другую форму. Код включает всё вышеописанное. В свойствах форм надо прописать следующее (прямо в студии выбираете эти значения):

Теперь вы не создаёте второго экземпляра Form1 и приложение всегда будет закрываться, не оставаясь в памяти.

Открываем форму поверх другой формы, как модальное окно

Чтобы открыть Form2 поверх Form1, как модальное окно, не скрывая Form1, вам хватит этого кода:

В итоге Form2 будет открыта поверх Form1. В этом случае пользователь не сможет переключиться на Form1 не закрыв Form2.

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

Модальные окна являются наиболее распространенным видом окон. Если открыто модальное окно, то чтобы попасть в основную программу, его обязательно нужно закрыть. Без закрытия модального окна невозможно перейти в программу, которая его вызвала. В программах Windows Forms возможна ситуация, когда одно модальное окно открывает другое (следующее) модальное окно. Таким образом получается цепочка вызовов.

Как правило, модальное окно содержит кнопки типа OK, Cancel (или другие), при нажатии на которые это окно закрывается.

При открытии немодального окна, существует возможность переключаться из окна в основную программу не закрывая это окно, и, наоборот, из основной программы можно снова вернуться в немодальное окно. Но при этом, визуально немодальное окно всегда размещается над основной программой. Как правило, немодальное окно содержит одну кнопку типа Close , которая его закрывает.

2. Особенности работы с немодальными окнами в Windows Forms

В технологии Windows Forms основной программе соответствует форма – экземпляр класса, унаследованного от класса Form . Также модальному или немодальному окну соответствует некоторая форма.

При работе с немодальными окнами были замечены следующие особенности:

  • в немодальном окне есть одна кнопка Close , которая его закрывает;
  • вызов немодального окна из главной программы происходит с помощью метода Show() класса Form (чтобы вызвать модальное окно нужно использовать метод ShowDialog() ).

В нижеследующем коде приведены примеры вызова модального и немодального окна

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

3. Способы обмена информацией между главной формой и немодальной формой

При использовании немодальных форм важным есть обмен информацией между основной программой (главной формой) и немодальной формой.

Здесь возможны две ситуации:

  • передача информации из главной формы в немодальную. Эта ситуация решается без проблем, поскольку в основной форме создается экземпляр немодальной формы. Через этот экземпляр осуществляется доступ к компонентам немодальной формы стандартным способом;
  • передача информации из немодальной формы в главную форму. Здесь возникает проблема: как из немодальной формы доступиться к экземпляру главной формы.

Чтобы передать данные (информацию) с немодальной формы в главную, можно использовать один из следующих способов:

4. Пример разработки демонстрационной программы использования немодальной формы

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

Демонстрационная программа состоит из двух форм: главной и немодальной. Из главной формы вызывается немодальная форма. Из немодальной формы происходит копирование информации из поля ввода в соответствующее поле ввода главной формы.

4.1. Создать проект типа Windows Forms

После создания проекта по шаблону Windows Forms автоматически создается главная форма, экземпляр которой называется Form1 .

4.2. Разработка основной формы

Создать основную форму и разместить на ней следующие элементы управления:

  • элемент управления типа Button . Создается экземпляр кнопки с именем button1 ;
  • элемент управления типа Label . Создается экземпляр метки с именем label1 ;
  • элемент управления типа TextBox . Создается экземпляр поля ввода с именем textBox1 .

Настроить свойства формы и элементов управления как показано на рисунке 1:

Также нужно откорректировать размеры главной формы.

После настройки главная форма будет иметь вид как изображено на рисунке 1.

Рисунок 1. Главная форма программы

4.3. Создать новую форму Form2

Создание новой формы осуществляется стандартным способом с помощью команд

4.4. Проектирование формы Form2

Разместить на форме Form2 следующие элементы управления:

  • один элемент управления типа Label . Будет создан объект с именем label1 ;
  • два элемента управления типа Button . Будет создано два объекта с именами button1 , button2 ;
  • один элемент управления типа TextBox . Будет создан экземпляр с именем textBox1 .

Настроить следующие свойства элементов управления формы Form2 :

После настройки немодальная форма будет иметь вид как изображено на рисунке 2.

Рисунок 2. Немодальная форма Form2 после настройки элементов управления

4.5. Ввод статической ссылки на форму Form1

В тексте класса Form1 нужно ввести статическую переменную с именем form1:

Статическая переменная имеет тип Control . Все элементы управления унаследованы из класса Control . Это же касается и формы.

4.6. Программирование обработчика события Click элемента управления button1 формы Form1

При нажатии на кнопке button1 ( Show Modeless Form ) открывается окно немодальной формы и в поле ввода немодальной формы ( Form2.textBox1.Text ) вписывается текст из поля ввода главной формы ( Form1.textBox1.Text ).

Чтобы выполнить этот пункт сначала нужно активировать форму Form1 . Затем нужно запрограммировать событие Click элемента управления button1 , размещенного на форме Form1 .

Текст обработчика события следующий:

4.7. Программирование обработчика события Click кнопки button1 формы Form2

При нажатии на кнопке button1 ( Copy to Form1 ) текст из поля ввода немодальной формы ( Form2.textBox1.Text ) должен скопироваться в соответствующее поле ввода главной формы ( Form1.textBox1.Text ).

Сначала нужно активировать форму Form2 и сформировать обработчик события Click элемента управления button1 .

Текст обработчика события следующий:

В обработчике события на основе статической ссылки form1 происходит циклический поиск элемента управления типа TextBox с именем textBox1 (на всякий случай, если в главной форме несколько textBox-ов).

4.8. Программирование обработчика события Click элемента управления button2

При нажатии на кнопке button2 нужно закрыть немодальную форму. Текст соответствующего обработчика следующий:

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

4.9. Запуск программы на выполнение

Читайте также: