Windows forms событие при закрытии формы

Событие при закрытии формы C# Решение и ответ на вопрос 1586968

12 / 27 / 12

Регистрация: 20.09.2013

Сообщений: 601

1

Событие при закрытии формы

20.11.2015, 11:20. Показов 22547. Ответов 8


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

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



975 / 870 / 350

Регистрация: 26.04.2012

Сообщений: 2,647

20.11.2015, 11:28

2

События FormClosing и FormClosed.



0



TheSecret

12 / 27 / 12

Регистрация: 20.09.2013

Сообщений: 601

20.11.2015, 12:27

 [ТС]

3

C#
1
2
3
private void Form_Closing(object sender, EventArgs e)
{
}

вот так?



0



Эксперт .NET

5857 / 4734 / 2940

Регистрация: 20.04.2015

Сообщений: 8,361

20.11.2015, 12:30

4

Цитата
Сообщение от TheSecret
Посмотреть сообщение

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

Закрытие главной формы программы в любом случае приведет к закрытию всей программы.



0



EvilFromHell

975 / 870 / 350

Регистрация: 26.04.2012

Сообщений: 2,647

20.11.2015, 12:41

5

Цитата
Сообщение от Даценд
Посмотреть сообщение

Закрытие главной формы программы в любом случае приведет к закрытию всей программы.

Ну а если что-то работает в Threade, не помеченном как Backgroung, то это утверждение будет неверным:

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
using System;
using System.Windows.Forms;
using System.Threading;
 
namespace WindowsFormsApplication63
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        bool goornot = true;
        private void Form1_Load(object sender, EventArgs e)
        {
            Thread th = new Thread(() =>
            {
                while (goornot) Thread.Sleep(666);
            });
            th.Start();
        }
 
        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            //goornot = false;        
        }
    }
}



0



Эксперт .NET

5857 / 4734 / 2940

Регистрация: 20.04.2015

Сообщений: 8,361

20.11.2015, 12:49

6

Цитата
Сообщение от EvilFromHell
Посмотреть сообщение

Ну а если что-то работает в Threade, не помеченном как Backgroung, то это утверждение будет неверным:

это да, о потоках я не подумал



0



12 / 27 / 12

Регистрация: 20.09.2013

Сообщений: 601

20.11.2015, 12:51

 [ТС]

7

Цитата
Сообщение от Даценд
Посмотреть сообщение

Закрытие главной формы программы в любом случае приведет к закрытию всей программы.

я не главную форму закрываю

Добавлено через 15 секунд

Цитата
Сообщение от Даценд
Посмотреть сообщение

Закрытие главной формы программы в любом случае приведет к закрытию всей программы.

я не главную форму закрываю



0



EvilFromHell

975 / 870 / 350

Регистрация: 26.04.2012

Сообщений: 2,647

20.11.2015, 12:54

8

Лучший ответ Сообщение было отмечено TheSecret как решение

Решение

Если нет потоков, то:

C#
1
2
3
4
        private void Form2_FormClosed(object sender, FormClosedEventArgs e)
        {
            Application.Exit();
        }



1



12 / 27 / 12

Регистрация: 20.09.2013

Сообщений: 601

20.11.2015, 12:57

 [ТС]

9

Цитата
Сообщение от EvilFromHell
Посмотреть сообщение

Если нет потоков, то:
private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
Application.Exit();
}

спасибо



0



If the user wants to exit the application by clicking on the exit icon or by ALT+F4, I’d like to make a dialog box questioning the user if he/she is really sure about exiting.

How do I capture this event before the application is actually closed?

marc_s's user avatar

marc_s

721k173 gold badges1320 silver badges1442 bronze badges

asked Jun 15, 2012 at 8:53

TtT23's user avatar

1

Check out the OnClosing event for the form.

Here is an extract from that link actually checks for a change on a text field and prompts a save:

private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
   // Determine if text has changed in the textbox by comparing to original text.
   if (textBox1.Text != strMyOriginalText)
   {
      // Display a MsgBox asking the user to save changes or abort.
      if(MessageBox.Show("Do you want to save changes to your text?", "My Application",
         MessageBoxButtons.YesNo) ==  DialogResult.Yes)
      {
         // Cancel the Closing event from closing the form.
         e.Cancel = true;
         // Call method to save file...
      }
   }
}

You can change the text to suit your needs, and then also I think you might want to switch the DialogResult.Yes to DialogResult.No based on your text.


Here is some modified code just for you:

private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
   if(MessageBox.Show("Are you sure you want to quit?", "My Application", MessageBoxButtons.YesNo) ==  DialogResult.No)
   {
      e.Cancel = true;
   }
}

answered Jun 15, 2012 at 8:55

musefan's user avatar

musefanmusefan

47.6k21 gold badges133 silver badges184 bronze badges

1

You should subscribe to the Form_Closing event
Post a dialog box there, and if user abort the closing set the FormCloseEventArgs.Cancel to true.

For example in the Form_Load or using the designer, subscribe the event

Form1.FormClosing += new FormClosingEventHandler(Form1_Closing);

....
private void Form1_FormClosing(Object sender, FormClosingEventArgs e) 
{
    DialogResult d = MessageBox.Show("Confirm closing", "AppTitle", MessageBoxButtons.YesNo );
    if(d == DialogResult.No)
        e.Cancel = true;
}

Depending on the situation is not always a good thing to annoy the user with this kind of processing.
If you have valuable modified data and don’t want the risk to loose the changes, then it is always a good thing to do, but if you use this only as a confirm of the close action then it’s better to do nothing.

answered Jun 15, 2012 at 8:56

Steve's user avatar

SteveSteve

212k22 gold badges229 silver badges286 bronze badges

You can handle the Form_Closing or Form_Closed events for this.

In Visual Studio click the lightning bolt icon and scroll down to these events in the form properties list. Double click on the one you want and it will hook up the event for you.

answered Jun 15, 2012 at 8:55

Bali C's user avatar

Bali CBali C

30k35 gold badges122 silver badges152 bronze badges

answered Jun 15, 2012 at 8:55

Sanja Melnichuk's user avatar

Sanja MelnichukSanja Melnichuk

3,4753 gold badges25 silver badges46 bronze badges

0

Is this just one form? If so, you might want to use the FormClosing event, which allows you to cancel it (show the dialog, then set CancelEventArgs.Cancel to true if the user chooses to cancel closing).

answered Jun 15, 2012 at 8:55

Jon Skeet's user avatar

Jon SkeetJon Skeet

1.4m851 gold badges9044 silver badges9133 bronze badges

If you’re talking about windows forms, should be enough to catch your MainWindow’s

FormClosing event and in case you want prevent closing, just set the argument of the event handler got fired, to true.

Example:

private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{

      if(MessageBox.Show("Do you really want to exit?", "My Application",
         MessageBoxButtons.YesNo) ==  DialogResult.No){

                // SET TO TRUE, SO CLOSING OF THE MAIN FORM, 
                // SO THE APP ITSELF IS BLOCKED
                e.Cancel = true;            
      }
   }
}

answered Jun 15, 2012 at 8:57

Tigran's user avatar

TigranTigran

61.3k8 gold badges85 silver badges122 bronze badges

I am looking to prompt the user to save data when they close a form window in a winforms application. I can’t figure out how to trigger the prompt to the user, should they click the red box at the top right corner of the form.

My application currently has a boolean flag, that is set to True on textchanged event. So I will only need to check for the boolean value in whatever event is trigger by the red box.

Any advice?

Cody Gray's user avatar

Cody Gray

236k50 gold badges486 silver badges567 bronze badges

asked Jan 31, 2011 at 13:01

user279521's user avatar

user279521user279521

4,76721 gold badges75 silver badges109 bronze badges

You need to handle the FormClosing event. This event is raised just before the form is about to be closed, whether because the user clicked the «X» button in the title bar or through any other means.

Because the event is raised before the form is closed, it provides you with the opportunity to cancel the close event. You are passed an instance of the FormClosingEventArgs class in the e parameter. By setting the e.Cancel property to True, you can cancel a pending close event.

For example:

Private Sub Form_Closing(ByVal sender As Object, ByVal e As FormClosingEventArgs)
    If Not isDataSaved Then
        ' The user has unsaved data, so prompt to save
        Dim retVal As DialogResult
        retVal = MessageBox.Show("Save Changes?", YesNoCancel)
        If retVal = DialogResult.Yes Then
            ' They chose to save, so save the changes
            ' ...
        ElseIf retVal = DialogResult.Cancel Then
            ' They chose to cancel, so cancel the form closing
            e.Cancel = True
        End If
        ' (Otherwise, we just fall through and let the form continue closing)
    End If
End Sub

answered Jan 31, 2011 at 13:11

Cody Gray's user avatar

Cody GrayCody Gray

236k50 gold badges486 silver badges567 bronze badges

1

If you override the form’s OnFormClosing method, you have the chance to notify the user that changes have been made, and the opportunity to cancel closing the form.

The event provides you with a FormClosingEventArgs instance which has a CloseReason property (which tells you why the form is closing) as well as a Cancel property, which you can set to True to stop the form from closing.

answered Jan 31, 2011 at 13:11

stuartd's user avatar

I implent this code for C# hope so it useful to you

protected override void OnFormClosing(FormClosingEventArgs e)
            {            
                base.OnFormClosing(e);
                if (PreClosingConfirmation() == System.Windows.Forms.DialogResult.Yes)
                {
                    Dispose(true);
                    Application.Exit();
                }
                else
                {
                    e.Cancel = true;
                }
            }

        private DialogResult PreClosingConfirmation()
        {
            DialogResult res = System.Windows.Forms.MessageBox.Show(" Do you want to quit?          ", "Quit...", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            return res;
        }

answered Feb 21, 2013 at 7:58

IMMORTAL's user avatar

IMMORTALIMMORTAL

2,6473 gold badges20 silver badges35 bronze badges

0

You need the FormClosing Event

answered Jan 31, 2011 at 13:12

Martin's user avatar

MartinMartin

39k20 gold badges100 silver badges130 bronze badges

I am looking to prompt the user to save data when they close a form window in a winforms application. I can’t figure out how to trigger the prompt to the user, should they click the red box at the top right corner of the form.

My application currently has a boolean flag, that is set to True on textchanged event. So I will only need to check for the boolean value in whatever event is trigger by the red box.

Any advice?

Cody Gray's user avatar

Cody Gray

236k50 gold badges486 silver badges567 bronze badges

asked Jan 31, 2011 at 13:01

user279521's user avatar

user279521user279521

4,76721 gold badges75 silver badges109 bronze badges

You need to handle the FormClosing event. This event is raised just before the form is about to be closed, whether because the user clicked the «X» button in the title bar or through any other means.

Because the event is raised before the form is closed, it provides you with the opportunity to cancel the close event. You are passed an instance of the FormClosingEventArgs class in the e parameter. By setting the e.Cancel property to True, you can cancel a pending close event.

For example:

Private Sub Form_Closing(ByVal sender As Object, ByVal e As FormClosingEventArgs)
    If Not isDataSaved Then
        ' The user has unsaved data, so prompt to save
        Dim retVal As DialogResult
        retVal = MessageBox.Show("Save Changes?", YesNoCancel)
        If retVal = DialogResult.Yes Then
            ' They chose to save, so save the changes
            ' ...
        ElseIf retVal = DialogResult.Cancel Then
            ' They chose to cancel, so cancel the form closing
            e.Cancel = True
        End If
        ' (Otherwise, we just fall through and let the form continue closing)
    End If
End Sub

answered Jan 31, 2011 at 13:11

Cody Gray's user avatar

Cody GrayCody Gray

236k50 gold badges486 silver badges567 bronze badges

1

If you override the form’s OnFormClosing method, you have the chance to notify the user that changes have been made, and the opportunity to cancel closing the form.

The event provides you with a FormClosingEventArgs instance which has a CloseReason property (which tells you why the form is closing) as well as a Cancel property, which you can set to True to stop the form from closing.

answered Jan 31, 2011 at 13:11

stuartd's user avatar

I implent this code for C# hope so it useful to you

protected override void OnFormClosing(FormClosingEventArgs e)
            {            
                base.OnFormClosing(e);
                if (PreClosingConfirmation() == System.Windows.Forms.DialogResult.Yes)
                {
                    Dispose(true);
                    Application.Exit();
                }
                else
                {
                    e.Cancel = true;
                }
            }

        private DialogResult PreClosingConfirmation()
        {
            DialogResult res = System.Windows.Forms.MessageBox.Show(" Do you want to quit?          ", "Quit...", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            return res;
        }

answered Feb 21, 2013 at 7:58

IMMORTAL's user avatar

IMMORTALIMMORTAL

2,6473 gold badges20 silver badges35 bronze badges

0

You need the FormClosing Event

answered Jan 31, 2011 at 13:12

Martin's user avatar

MartinMartin

39k20 gold badges100 silver badges130 bronze badges

C#: как узнать, что пользователь кликнул на кнопку ‘X’ формы? Печать

Добавил(а) microsin

  

Задача — определить разные источники действий пользователя, которые приводят к закрытию формы. Например, пользователь может кликнуть на стандартной кнопке с крестиком X (которая находится в правом верхнем углу окна, на плашке), либо он может кликнуть на отдельной кнопке пользователя, обработчик которой закрывает форму.

[Событие FormClosing]

Если используются WinForms, то можно использовать событие FormClosing(). Оно срабатывает всякий раз, когда форма закрывается. Чтобы детектировать действие пользователя, когда он кликнул либо на стандартной кнопке X либо на Вашей кнопке CloseButton, можно получить информацию через объект sender. Попробуйте привести тип источника события (cast sender) как управляющий элемент кнопки (Button control), и проверьте эго имя — к примеру, равно ли оно «CloseButton».

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
   if (string.Equals((sender as Button).Name, @"CloseButton"))
   {
      // Действия, соответствующие CloseButton.
      ...
   }
   else
   {
      // Другие действия, которые приводят к закрытию формы.
      // Предположительно пользователь кликнул на кнопку 'X'.
      ...
   }
}

Закрытие формы комбинацией клавиш ALT+F4 также приведет к вызову события FormClosing(), поскольку это связано с отправкой сообщения закрытия для формы. Вы можете отменить действие события закрытия формы, если присвоите FormClosingEventArgs.Cancel = true.

Для нашего примера достаточно вставить в обработчик Form1_FormClosing следующий код:

Обратите внимание на различие между событиями FormClosing() и the FormClosed(). FormClosing происходит, когда форма приняла сообщение для закрытия, и в обработчике FormClosing можно выполнить некоторые действия, которые произойдут перед закрытием формы и уничтожением его экземпляра класса (в частности, можно отменить закрытие формы, как мы сделали в предыдущем примере). Событие FormClosed происходит, когда форма по-настоящему закрыта, т. е. здесь можно выполнить действия, которые произойдут после закрытия формы.

[CloseReason]

Перечисление CloseReason, описание которого можно найти в MSDN, позволяет определить, каким образом пользователем было закрыто приложение — либо при выключении компьютера, либо через Диспетчер Задач (task manager), и т. д. Чтобы дифференцировать друг от друга причины закрытия, можно использовать примерно такой код:

void Form_FormClosing(object sender, FormClosingEventArgs e)
{
   if(e.CloseReason == CloseReason.UserClosing)
   {
      // Приложение закрыл пользователь, можно предложить ему сохранить данные
      ...
   }
   if(e.CloseReason == CloseReason.WindowsShutDown)
   {
      // Автосохранение и очистка ресурсов
      ...
   }
}

Однако в этом коде нет различий между кликом на кнопке x, правым кликом на плашке и выбором в контекстном меню «Закрыть», нажатием Alt+F4, и т. п. Все это действия пользователя, так что они будут соответствовать CloseReason.UserClosing.

[DialogResult]

Кнопка «X» соответствует DialogResult.Cancel, так что это дополнительная возможность оценки результата закрытия диалога. Если на форме есть несколько кнопок, то возможно Вы можете захотеть связать разные DialogResult с каждой, и это даст дополнительную информацию для того, чтобы отличать кнопки друг от друга. Например: btnSubmit.DialogResult = DialogResult.OK, btnClose.DialogResult = Dialogresult.Abort, и т. п.

public Form1()
{
   InitializeComponent();
 
   this.FormClosing += Form1_FormClosing;
}
 
/// < summary >
/// Переопределение события Close для формы
/// < /summary >
/// < param name="sender" >< /param >
/// < param name="e" >< /param >
private void Form1_FormClosing(Object sender, FormClosingEventArgs e)
{
   //В случае, когда Windows завершает работу, мы не будем управлять процессом:
   if (e.CloseReason == CloseReason.WindowsShutDown)
      return;
 
   if (this.DialogResult == DialogResult.Cancel)
   {
      // Предположим, что кликнули на X, и выполним соответствующие действия.
      // Выдача запроса подтверждения пользователю:
      switch (MessageBox.Show(this, "Вы уверены?",
                              "Действительно хотите ... ?",
                              MessageBoxButtons.YesNo, MessageBoxIcon.Question))
      {
      case DialogResult.No:
         // Остаемся в этой форме
         e.Cancel = true;
         break;
      default:
         break;
      }
   }
}

[Ссылки]

1. How to know user has clicked X or the Close button site:stackoverflow.com.

В платформе .NET, как и в Win32, для информирования о возникновении какого-либо состояния или о действии используются события, или иногда их еще называют сообщения (по-английски: events). Например, в ответ на изменение положения окна оно генерирует событие определенного класса, которое мы можем перехватить.

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

С помощью визуального дизайнера Visual Studio создание обработчиков событий превращается в тривиальную задачу. На рис. 5.8 показана панель Properties в режиме просмотра событий. Чтобы увидеть что-то подобное, нужно выделить компонент, событие которого вы хотите поймать, и нажать кнопку Events в панели Properties (на рис. 5.8 эта кнопка обведена кружком). Чтобы вернуться обратно к просмотру свойств, надо щелкнуть по кнопке Properties, которая находится левее.

Панель Properties 
при просмотре событий

Рис. 5.8. Панель Properties
при просмотре событий

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

Давайте создадим обработчик события MouseClick. Выделите форму, перейдите
в панели Properties в режим просмотра событий Events и щелкните двойным щелчком напротив события. Будет создан метод Form1_MouseClick():

   private void Form1_MouseClick(object sender, MouseEventArgs e)
   {
     MessageBox.Show("Клик");
   }

Я здесь добавил внутрь метода обработки события вызов статического метода Show() класса MessageBox. Этот метод отображает на рабочем столе диалоговое окно с сообщением, которое вы передали в качестве параметра. В нашем случае каждый раз, когда вы щелкнете по форме, будет появляться сообщение: Клик.

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

  • Load — загрузка;
  • Activate — активация;
  • VisibleChanged — изменилось свойство Visible.
  • А при закрытии формы генерируются следующие события:
  • Deactivated — деактивировано;
  • Closing — закрытие формы (можно отменить закрытие);
  • Close — форма закрыта, и назад дороги нет.

Событие Load генерируется, когда вы впервые вызываете метод Show() для отображения формы. Посмотрим на следующий пример:

   MyForm form = new MyForm();
   form.Show();   // отобразить форму
   form.Hide();   // спрятать с помощью Hide()
   form.Show();   // Отобразить снова

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

Очень часто у вас будут возникать казусы со случайным созданием событий. Например, если щелкнуть двойным щелчком по компоненту в визуальном дизайнере, то будет создан обработчик события по умолчанию для этого компонента. Так, для кнопки событием по умолчанию является Click, и если вы случайно щелкнете двойным щелчком по компоненту в визуальном дизайнере, то будет создан такой обработчик события. А если вы не хотели его создавать? Оставлять заготовку
метода в коде? Наверное, лучше, все же, убрать обработчик события, чтобы он не мешал. Как это сделать?

Существует несколько вариантов:

  • Выделите компонент в визуальном дизайнере и перейдите в режим Events в панели свойств. Напротив события удалите в поле название метода, созданного для обработчика события. Визуальный редактор удалит регистрацию события, которую он автоматически добавил в свой метод InitializeComponent(). Если
    в обработчике события не было кода, то заготовка для метода исчезнет и из кода.
  • Если обработчик события содержит код, но он уже не нужен, то можно сначала удалить код из обработчика события, а потом выполнить действия из предыдущего пункта.
  • Если обработчик события содержит код, то можно сначала удалить имя обработчика события в режиме Events панели свойств, а потом безболезненно удалить код метода.

Если вы создали обработчик события и тут же удалили метод в редакторе кода,
то при этом среда разработки не удалит регистрацию события в методе InitializeComponent(). Это придется делать вручную. Как это сделать безболезненно? Давайте посмотрим на примере.

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

private void button1_Click(object sender, EventArgs e)
{
}

Удалите эту заготовку кода из редактора и попробуйте скомпилировать проект. Внизу окна появится сообщение об ошибке (рис. 5.9). В этой ошибке компилятор сообщает нам, что обработчик события не найден. Щелкните двойным щелчком по ошибке, и откроется вкладка с файлом (Form1.Designer.cs), где найдена ошибка, и

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

 Сообщение об ошибке, что обработчик события не найден

Рис. 5.9. Сообщение об ошибке, что обработчик события не найден

Это бесплатная глава книги Библия C#. В новом издании эта глава переписана с учетом универсальных при-ложений Windows, а старая версия главы, которая не потеряла еще своей актуаль-ности стала бесплатной и доступной всем.

Все исходные коды главы 5 Библии C#

Имеется многооконное приложение. При запуске вызывается что-то на-подобии «Окна входа», где пользователь вводит, к примеру, логин и пароль. При наличии в базе пары введенный логин-пароль «Окно входа» закрывается и открывается «Основное
окно», из которого последовательно вызываются другие окна, а оно закрывается. Понятно, что с привязкой формы к приложению это все организовать не получится(точнее сделать то можно, меняя у форм свойство Visible, но это будет «жрать неимоверное количество
памяти», а это не очень хорошо), поэтому в файле «Program.cs» пишу следующий код:

[STAThread]
    static void Main()
    {
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      Form1 form1 = new Form1();
        form1.Show(); 
      Application.Run(); //запустить независимое от Form1 приложение 
    }

Затем в нужном месте просто пишу что-то на-подобии:

Form2 form2 = new Form2(); //создать экземпляр типа Form2
form2.Show(); //отобразить его
this.Close(); //закрыть текущую форму

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

Пытался идентифицировать каким именно способом закрылась форма: с помощью кода

или по нажатию пользователя на «крестик». Но оба этих события передают в метод Form_Closing один и тот же аргумент FormClosingEventArgs, который в поле CloseReason содержит значение UserClosing, т.е. таким макаром не отследить. Подумал: «может
создать некоторую переменную типа Boolean, значение в которой изменять по нажатии на мою клавишу для закрытия и в зависимости от её значения завершать процесс приложения или нет», но эта переменная должна быть глобальной, а использование таких переменных
также не очень хорошо. В итоге: я встал в тупик…

Может кто-то подскажет каким образом можно корректно реализовать многооконное приложение, чтобы не возникало вышеописанных проблем.

Понравилась статья? Поделить с друзьями:
  • Windows forms преобразование строки в число
  • Windows forms подключение к sql server
  • Windows forms передача данных между формами
  • Windows forms конструктор формы как открыть
  • Windows forms как работать с графикой