Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

Singleton pattern for MDI child forms

0.00/5 (No votes)
22 Jun 2004 1  
Use singleton pattern for creating MDI child forms.

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.

  1. Make MDI.cs, Form1.cs, and Form2.cs forms. (Set MDI.cs as MDI container.)
  2. 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()
{
    //

    // Required for Windows Form Designer support

    //

    InitializeComponent();

    //

    // TODO: Add any constructor code after InitializeComponent call

    //

}

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()
{
    //

    // Required for Windows Form Designer support

    //

    InitializeComponent();

    //

    // TODO: Add any constructor code after InitializeComponent call

    //

}

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.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here