Windows Forms Events Lifecycle

Today there are a large number of books covering .NET and Windows Forms. While most of these books discuss the essentials of working with Windows Forms and guide you well on your way to becoming proficient in developing Windows Forms applications, very few books cover a vital and much needed topic. And this topic is: the sequence of events that are triggered for a Form. Knowing the lifecycle of a Form can help you place important bits of code in relevant events.

If you look at ASP.NET tutorials and books, you will find many references to the Web Page lifecyle but what about Windows Forms lifecycle? Sadly, there's not much concrete information about this. The aim of this article is, therefore, to delve into this topic and provide insightful knowledge about Form events.

The events in the lifecycle of a Form from the time it is launched to the time it is closed are listed below:

Move: This event occurs when the form is moved. Although by default, when a form is instantiated and launched, the user does not move it, yet this event is triggered before the Load event occurs.

Load: This event occurs before a form is displayed for the first time.

VisibleChanged: This event occurs when the Visible property value changes.

Activated: This event occurs when the form is activated in code or by the user.

Shown: This event occurs whenever the form is first displayed.

Paint: This event occurs when the control is redrawn.

Deactivate: This event occurs when the form loses focus and is not the active form.

2. Give a suitable name and click OK. This will create the aplication and open it in Design view.

Figure 2: Application in the Design view

3. Open the Form properties window. The easiest way to do this is: select the Form in the design view and press the F4 key.

4. Click the Events tab and select the Move event.

Figure 3: Form events

5. Double click on it. This will cause the event handler to be auto-generated in the Code View.

6. Switch back to the Design View and in the Form properties window, double click the Load event.

7. Likewise, repeat this procedure for all the events that were listed earlier.

8. Open the Code View of Form1.Designer.cs and add the code marked in bold.

using System.IO;

namespace LifecycleDemo

{

partialclassForm1

{

StreamWriter sr = newtreamWriter("D:\\formevents.txt");

///<summary>

/// Required designer variable.

///</summary>

private System.ComponentModel.IContainer components = null;

///<summary>

/// Clean up any resources being used.

///</summary>

///<param name="disposing">true if managed resources should be disposed; otherwise, false.</param>

protectedoverridevoid Dispose(bool disposing)

{

if (disposing && (components != null))

{

components.Dispose();

}

base.Dispose(disposing);

sr.Close();

}

#region Windows Form Designer generated code

#endregion

}

}

9. Open the Code View of Form 1 and add the code marked in bold.

publicpartialclassForm1 : Form

{

public Form1()

{

InitializeComponent();

}

privatevoid Form1_Move(object sender, EventArgs e)

{

sr.WriteLine("1 - Move event");

}

privatevoid Form1_Load(object sender, EventArgs e)

{

sr.WriteLine("2 - Load event");

}

privatevoid Form1_Activated(object sender, EventArgs e)

{

sr.WriteLine("3 - Activated event");

}

privatevoid Form1_VisibleChanged(object sender, EventArgs e)

{

sr.WriteLine("4 - VisibleChanged event");

}

privatevoid Form1_Shown(object sender, EventArgs e)

{

sr.WriteLine("5 -Shown event");

}

privatevoid Form1_Paint(object sender, PaintEventArgs e)

{

sr.WriteLine("6 - Paint event");

}

privatevoid Form1_FormClosed(object sender, FormClosedEventArgs e)

{

sr.WriteLine("7 -FormClosed event");

}

privatevoid Form1_FormClosing(object sender, FormClosingEventArgs e)

{

sr.WriteLine("8 - FormClosing");

}

privatevoid Form1_Deactivate(object sender, EventArgs e)

{

sr.WriteLine("9 - Deactivate");

}

}

10. Next, you save, build and execute the application. (File->Save is used for the save operation and Build->Build Solution is used to build the application. To execute, click Debug->Start Debugging.

Figure 4: Form shown during execution of the application

11. Switch to some other application, such that the form is no longer in focus.

12. Switch back to the Windows Form so that it regains focus.

13. Exit the Windows Form application.

14. Open the text file, formevents.txt. You will observe the output similar to the one shown in Figure 5. (Output may vary if you perform some other actions in between causing additional events to be raised).

Figure 5: Text file contents showing event lifecycle

The Move, Load, VisibleChanged and Activated events are raised even before the Form is shown. Then the Shown event takes place. This is followed by the Paint event. These events are common for any application and are always standard.

When you switch the focus to some other application, the Deactivate event occurs. When the form regains focus, the Activated event is raised. Then the form is painted again because it has regained focus.

When you attempt to close the form, the FormClosing and FormClosed events are raised. Finally, after the form is closed, Deactivate is raised once more. If you had inserted a WriteLine for Dispose as well (which has not been written as of now) you would see that statement appearing after the Deactivate.

Conclusion: Thus, you learned about the lifecycle of events in a Windows Form.