Click here to Skip to main content
11,642,402 members (66,402 online)
Click here to Skip to main content

Singleton pattern for MDI child forms

, 22 Jun 2004 94.6K 961 50
Rate this:
Please Sign up or sign in to vote.
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

Share

About the Author

Ali Zolghadri
Architect
Canada Canada
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.

You may also be interested in...

Comments and Discussions

 
QuestionSuperb Article!!! Pin
PoojaGRD14-Jul-11 0:52
memberPoojaGRD14-Jul-11 0:52 
GeneralMy vote of 5 Pin
ehsan assu16-Jul-10 3:47
memberehsan assu16-Jul-10 3:47 
GeneralExcellent Article Pin
dawsona052616-Oct-08 8:27
memberdawsona052616-Oct-08 8:27 
GeneralGood stuff Pin
en_bee26-Apr-07 8:15
memberen_bee26-Apr-07 8:15 
Generali solved my problem in another way Pin
ismailkirkan1-Nov-06 5:38
memberismailkirkan1-Nov-06 5:38 
GeneralMdi Child Form Pin
danmagbiro18-Mar-07 23:29
memberdanmagbiro18-Mar-07 23:29 
GeneralRe: i solved my problem in another way Pin
okutbay5-Oct-07 8:35
memberokutbay5-Oct-07 8:35 
GeneralThis solution is good Pin
Judylizq16-Jul-06 19:02
memberJudylizq16-Jul-06 19:02 
Generalit not works fine Pin
thor77@linuxmail.org21-Oct-05 4:45
memberthor77@linuxmail.org21-Oct-05 4:45 
GeneralCongratulations Pin
Milton Miranda Neto26-Jun-05 14:53
memberMilton Miranda Neto26-Jun-05 14:53 
Generalgreat article !! Pin
avit11-Feb-05 2:49
memberavit11-Feb-05 2:49 
GeneralChildren Singletons are NOT .Net Singletons... Pin
Enigmativity29-Jun-04 16:22
memberEnigmativity29-Jun-04 16:22 
GeneralRe: Children Singletons are NOT .Net Singletons... Pin
Ali Zolghadri30-Jun-04 11:30
memberAli Zolghadri30-Jun-04 11:30 
GeneralRe: Children Singletons are NOT .Net Singletons... Pin
Enigmativity30-Jun-04 15:08
memberEnigmativity30-Jun-04 15:08 
General.dispose Pin
eyyap29-Jun-04 4:19
membereyyap29-Jun-04 4:19 
GeneralRe: .dispose Pin
Ali Zolghadri29-Jun-04 7:03
memberAli Zolghadri29-Jun-04 7:03 
JokeRe: .dispose Pin
shinyu13-May-06 1:21
membershinyu13-May-06 1:21 

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

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

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