Introduction
When you make a MDI (Multi Document Interface) application, you usually need to have only one instance of each child-form to be open at any point of time. You can loop through all the open forms before showing a new form, and make sure that the form has not been opened before. In this article, I show you how you can use singleton pattern to accomplish the same result.
Using the code
The following steps will show you how to make a MDI child form using Singleton pattern.
- Make MDI.cs, Form1.cs, and Form2.cs forms. (Set MDI.cs as MDI container.)
- Add a menu bar and make two menu items:
menuItem1
, menuItem2
.
If you open form1.cs in code view mode, you should see:
public Form1()
{
InitializeComponent();
}
Since the constructor is public
, you can make an instance of Form1
by using "new
" keyword:
Form f = new Form1();
Every time you do this, it makes a new instance of Form1
. Now, we should implement a logic that makes only one instance and returns that instance wherever Form1
is called.
To do so, make these changes:
private static Form1 aForm= null;
public static Form1 Instance()
{
if(aForm==null)
{
aForm= new Form1();
}
return aForm;
}
private Form1()
{
InitializeComponent();
}
Now, every time you need to access an instance of Form1
, simply call its Instance()
method, which is a public static
member:
Form f = Form1.Instance();
First time you call this method, it checks the value of aForm
variable, if it is null
, it makes an instance of Form1
and assigns it to aForm
, which is a static
variable. After that, any time you call the Instance()
method, it gets the object from the aForm
instead of creating a new instance.
Now, let's map menuItem1
to Form1
and menuItem2
to Form2
. Double click on menu items, then put the logic in:
private void menuItem1_Click(object sender, System.EventArgs e)
{
Form f = Form1.Instance();
f.MdiParent = this;
f.Show();
f.Activate();
}
private void menuItem2_Click(object sender, System.EventArgs e)
{
Form f = new Form2();
f.MdiParent = this;
f.Show();
}
There is one more important thing that you need to do. Since aForm
is a static variable, if you close the Form1
, the value of aForm
won't get reset automatically, so you need to do a clean up. To do this, add "aForm = null;"
to the dispose
method of Form1
:
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
aForm = null;
}
Now, you can run the application. Every time you click on menuItem2
, it opens a new instance of Form2
, but you can only open one instance of Form1
.