When you call Hide() against Form2, execution returns to the ShowDialog() line.
Instead of ShowDialog(), use Show(). You can subscribe to the FormClosed() event to know when the form was closed.
Form1:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
this.Hide();
Form2 frm = new Form2();
frm.FormClosed += Frm_FormClosed;
frm.Show();
}
private void Frm_FormClosed(object sender, FormClosedEventArgs e)
{
this.Close();
}
}
Form2:
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
this.Hide();
Form3 frm = new Form3();
frm.FormClosed += Frm_FormClosed;
frm.Show();
}
private void Frm_FormClosed(object sender, FormClosedEventArgs e)
{
this.Close();
}
}
Form3:
public partial class Form3 : Form
{
public Form3()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
this.Close();
}
}