multiple forms problem

  • Thread starter Thread starter KC Eric
  • Start date Start date
K

KC Eric

Hi all,

If I have 2 forms,

the first form has a button, when clicked, it calls and display the second
form. The question is how can I close the first form and only display the
second form?

Thanks,
KC
 
You can't start two forms using Application.Run and when the primary form is
closed, all the other forms are closed also.

I think the way to do it is to use three forms. The main application form
will run offscreen and will bring up the first form using the Show command.
It will need to manage the creation of new forms through some method it
exposes. It will also need to be informed of when the other forms are closed
so it can exit when they are all closed. This is a sort of multiple
top-level document scenario.

--
Bob Powell [MVP]
Visual C#, System.Drawing

Find great Windows Forms articles in Windows Forms Tips and Tricks
http://www.bobpowell.net/tipstricks.htm

Answer those GDI+ questions with the GDI+ FAQ
http://www.bobpowell.net/faqmain.htm

All new articles provide code in C# and VB.NET.
Subscribe to the RSS feeds provided and never miss a new article.
 
Something like the app seen after my signature.

--
Bob Powell [MVP]
Visual C#, System.Drawing

Find great Windows Forms articles in Windows Forms Tips and Tricks
http://www.bobpowell.net/tipstricks.htm

Answer those GDI+ questions with the GDI+ FAQ
http://www.bobpowell.net/faqmain.htm

All new articles provide code in C# and VB.NET.
Subscribe to the RSS feeds provided and never miss a new article.
------------------------------------------------------------------------------------------

using System;

using System.Drawing;

using System.Collections;

using System.ComponentModel;

using System.Windows.Forms;

using System.Data;

namespace runtwoforms

{

/// <summary>

/// Summary description for Form1.

/// </summary>

public class Form1 : System.Windows.Forms.Form

{

/// <summary>

/// Required designer variable.

/// </summary>

private System.ComponentModel.Container components = null;

public Form1()

{

//

// Required for Windows Form Designer support

//

InitializeComponent();

//

// TODO: Add any constructor code after InitializeComponent call

//

}

/// <summary>

/// Clean up any resources being used.

/// </summary>

protected override void Dispose( bool disposing )

{

if( disposing )

{

if (components != null)

{

components.Dispose();

}

}

base.Dispose( disposing );

}

#region Windows Form Designer generated code

/// <summary>

/// Required method for Designer support - do not modify

/// the contents of this method with the code editor.

/// </summary>

private void InitializeComponent()

{

//

// Form1

//

this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);

this.ClientSize = new System.Drawing.Size(292, 266);

this.Name = "Form1";

this.Text = "Form1";

this.Load += new System.EventHandler(this.Form1_Load);

}

#endregion

/// <summary>

/// The main entry point for the application.

/// </summary>

[STAThread]

static void Main()

{

Application.Run(new Form1());

}

int formcount=0;

private void Form1_Load(object sender, System.EventArgs e)

{

this.FormBorderStyle=FormBorderStyle.FixedSingle;

this.Location=new Point(-1000,-1000);

this.Size=new Size(100,100);

CreateForm();

}

private void Form_Disposed(object sender, EventArgs e)

{

formcount--;

if(formcount==0)

Application.Exit();

}

public void CreateForm()

{

Form2 f2=new Form2();

f2.Disposed+=new EventHandler(Form_Disposed);

f2.MainApp=this;

formcount++;

f2.Show();

}

}





/// <summary>

/// Summary description for Form2.

/// </summary>

public class Form2 : System.Windows.Forms.Form

{

private System.Windows.Forms.Button button1;

/// <summary>

/// Required designer variable.

/// </summary>

private System.ComponentModel.Container components = null;

public Form2()

{

//

// Required for Windows Form Designer support

//

InitializeComponent();

//

// TODO: Add any constructor code after InitializeComponent call

//

}

/// <summary>

/// Clean up any resources being used.

/// </summary>

protected override void Dispose( bool disposing )

{

if( disposing )

{

if(components != null)

{

components.Dispose();

}

}

base.Dispose( disposing );

}

#region Windows Form Designer generated code

/// <summary>

/// Required method for Designer support - do not modify

/// the contents of this method with the code editor.

/// </summary>

private void InitializeComponent()

{

this.button1 = new System.Windows.Forms.Button();

this.SuspendLayout();

//

// button1

//

this.button1.Location = new System.Drawing.Point(96, 104);

this.button1.Name = "button1";

this.button1.TabIndex = 0;

this.button1.Text = "Another";

this.button1.Click += new System.EventHandler(this.button1_Click);

//

// Form2

//

this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);

this.ClientSize = new System.Drawing.Size(292, 266);

this.Controls.Add(this.button1);

this.Name = "Form2";

this.Text = "Form2";

this.ResumeLayout(false);

}

#endregion

private void button1_Click(object sender, System.EventArgs e)

{

MainApp.CreateForm();

}

Form1 _mainApp;

public Form1 MainApp

{

get{return _mainApp;}

set{_mainApp=value;}

}

}





}
 
Hi Bob, Eric

pardon my jumping in, but I think, there is more sophisticated solution than
the one you proposed.

Just call Application.Run() in your Main funftion without the
Form-Parameter, for example:

static void Main()
{
Form1 f = new Form1();
f.Show();
Application.Run( );
}

So you can close Form1 without shuting down the app, therfor you can
implement the following button click event for Form1

private void button1_Click(object sender, System.EventArgs e)
{
Form2 f = new Form2();
f.Show();
this.Close();
}

Of Course now you have to shutdown your app by yourself. For examplwe you
could assign a Closed event to Form2

private void Form2_Closed(object sender, System.EventArgs e)
{
Application.ExitThread();
}

Just my 2 cents
Peter
 
Back
Top