Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Switching between Forms in C#

When the autogenerated code for my program starts, it calls

Application.Run(new Form1());

and starts Form1. I have another form I'd like to switch to and close Form1 at the same time. The problem is if I use "this.Close()" in Form1 before I call the other form with "Form.ShowDialog()" then the program ends. If I put it after ShowDialog then it remains up in the background until I close Form2, at which point the program ends.

How can I spawn a copy of Frame2 while closing the currently opened frame at the same time?

edit: I have tried calling Frame2 with .Show() as well, but the new frame closes instantly.

like image 626
rumsey Avatar asked May 25 '11 08:05

rumsey


People also ask

How do I swap between forms in C#?

The trick is to use Application. Run() without parameters and Application. Exit() at the point where you want to exit the application. Now when you run the application, Form1 opens up.


3 Answers

The following solution works as you expect.

To try this sample code, create a new WinForms application in Visual Studio (i.e. File --> New Project, select Visual C# --> Windows Classic Desktop and use the template "Windows Forms App (.NET Framework)"), then add a 2nd form.

Ensure the two forms are named as Form1 and Form2, then modify the code in the generated solution as follows:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.FormClosed += 
           new System.Windows.Forms.FormClosedEventHandler(this.Form1_FormClosed);
    }

    private void Form1_FormClosed(object sender, FormClosedEventArgs e)
    {
        (new Form2()).Show();
    }
}

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
        this.FormClosed += 
           new System.Windows.Forms.FormClosedEventHandler(this.Form2_FormClosed);
    }

    private void Form2_FormClosed(object sender, FormClosedEventArgs e)
    {
        Application.Exit();
    }
}

And this is the entry point of the application, modify it as follows:

static class Program
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        //Show first form and start the message loop
        (new Form1()).Show();
        Application.Run(); // needed, otherwise app closes immediately
    }

}

The trick is to use Application.Run() without parameters and Application.Exit() at the point where you want to exit the application.

Now when you run the application, Form1 opens up. Click on the X (upper right corner) and Form1 closes, but Form2 appears instead. Click on the X again and the form closes (and exits the application too).

Instead of placing the launch of Form2 into the FormClosed event, you could also create a button Button1 which does the job, but in that case don't forget to close the form to which the button belongs to via this.Close() explicitly:

    private void button1_Click(object sender, EventArgs e)
    {
        (new Form2()).Show(); this.Close();
    }
like image 120
Matt Avatar answered Oct 21 '22 18:10

Matt


You need to call this.Hide() which makes it invisible but still open, instead of this.Close() which closes it (and seeing as it is the main form of the application, closes the application too).

like image 42
Jackson Pope Avatar answered Oct 21 '22 19:10

Jackson Pope


Found this question and a codeproject on the same google.

The author basically creates a top-level form that manages switching between the forms he wants to show.

like image 22
Nathan Goings Avatar answered Oct 21 '22 18:10

Nathan Goings