Click here to Skip to main content
Click here to Skip to main content

Singleton pattern for MDI child forms

By , 22 Jun 2004
 

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

About the Author

Ali Zolghadri
Architect
Canada Canada
Member
I worked for the software industry as a software architect, system analyst, senior software engineer and MIS (management information system) consultant for last 10 years.

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
QuestionSuperb Article!!!memberPoojaGRD14 Jul '11 - 0:52 
GeneralMy vote of 5memberehsan assu16 Jul '10 - 3:47 
GeneralExcellent Articlememberdawsona052616 Oct '08 - 8:27 
GeneralGood stuffmemberen_bee26 Apr '07 - 8:15 
Generali solved my problem in another waymemberismailkirkan1 Nov '06 - 5:38 
GeneralMdi Child Formmemberdanmagbiro18 Mar '07 - 23:29 
GeneralRe: i solved my problem in another waymemberokutbay5 Oct '07 - 8:35 
GeneralThis solution is goodmemberJudylizq16 Jul '06 - 19:02 
Generalit not works finememberthor77@linuxmail.org21 Oct '05 - 4:45 
GeneralCongratulationsmemberMilton Miranda Neto26 Jun '05 - 14:53 
Generalgreat article !!memberavit11 Feb '05 - 2:49 
GeneralChildren Singletons are NOT .Net Singletons...memberEnigmativity29 Jun '04 - 16:22 
GeneralRe: Children Singletons are NOT .Net Singletons...memberAli Zolghadri30 Jun '04 - 11:30 
GeneralRe: Children Singletons are NOT .Net Singletons...memberEnigmativity30 Jun '04 - 15:08 
General.disposemembereyyap29 Jun '04 - 4:19 
GeneralRe: .disposememberAli Zolghadri29 Jun '04 - 7:03 
JokeRe: .disposemembershinyu13 May '06 - 1:21 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web02 | 2.6.130516.1 | Last Updated 23 Jun 2004
Article Copyright 2004 by Ali Zolghadri
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid