Why do my C# Form closed when displayed? - c#

i have 2 forms, those are form1.cs and form2.cs
on the form1, it has button1, which will call form2 to show
here's the button1 code
private void button1_Click(Object sender, EventArgs e )
{
form2 form = new form2();
form2.show(); // to call form2
this.dispose(); //to dispose form1
}
and then form2 showed, and it closed suddenly. anyone know how to solve this ?

When you close your main form with this.dispose() you are terminating the program causing form2 to be disposed also because you are diposing the reference to form2. You would be better off passing a reference to your form1 to form2 and using this.Hide() instead.
You can try something like this:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Form2 form = new Form2();
form.setParent(this);
form.Show();
this.Hide();
}
}
And in form2 to go back to form1
public partial class Form2 : Form
{
Form parentForm;
public Form2()
{
InitializeComponent();
}
public void setParent(Form value)
{
parentForm = value;
}
private void button1_Click(object sender, EventArgs e)
{
parentForm.Show();
this.Close();
}
}

private void button1_Click(Object sender, EventArgs e )
{
form2 form = new form2();
form2.show(); // to call form2
this.hide(); //to hide form1
}

if form1 is program starter then application will close . Hence instead
this.dispose();
U just write
this.hide();

Show() does not wait for form2 to close before continuing to the next command (dispose).
This will end up in closing form2 because it's probably running on a background thread.
Use ShowDialog to hold the execution of Dispose until the second form closes.
Also, you can set the second form to run on a foreground thread. This way the second form will not be dependent on the life of the first.

You can either use this.Hide() which should hide your current form or use a thread to open the new form.
Example: C# open a new form, and close a form...

Related

Detect when a child form is closed

I have he following Form:
An Initialize Function that is called when the Form1 is created.
A button that opens another Form (Form2)
What I need is to call Initialize() not only when Form1 is created, but whenever Form2 is closed, since Form2 might have modified some stuff that makes Initialize need to be called again.
How can I detect when the form2 is closed?
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Initialize();
}
void Initialize()
{
// Read a config file and initialize some stuff
}
// Clicking this button will open a Form2
private void button1_Click(object sender, EventArgs e)
{
var form2 = new Form2().Show();
}
}
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
// some stuff that Form2 does which involves modifying the config file
}
}
You just need to add an event handler for the FormClosing event, this handler could be in your first form class and here you can call every internal method of that class
private void button1_Click(object sender, EventArgs e)
{
var form2 = new Form2();
form2.FormClosing += childClosing;
form2.Show();
}
private void childClosing(object sender, FormClosingEventArgs e)
{
Initialize();
....
}
In addition to Steve's excellent answer, you may consider displaying Form2 as a modal dialog. This would mean code execution in Form1 STOPS until Form2 is dismissed. This may or may not work well with your application, we have no idea what it does.
At any rate, you'd use ShowDialog() instead of Show() like this:
// Clicking this button will open a Form2
private void button1_Click(object sender, EventArgs e)
{
var form2 = new Form2().ShowDialog(); // <-- code STOPS here until form2 is closed
Initialize(); // form2 was closed, update everything
}

Form1 hides instead of closing

I am trying to create a simple login page on which if i click login button form1 should hide and form2 should popup and on form2 when i click logout it should bring me back to form1, problem is that when i click logout button on form2 it brings me back to form1 like it should but when i click "X" (Close) on form1 it hides (I can see the application running in task manager) instead of closing.
form1 sign in button code:
private void button1_Click(object sender, EventArgs e)
{
Form2 mainUI = new Form2();
mainUI.Show();
this.Hide();
}
form2 logout button code:
private void button1_Click(object sender, EventArgs e)
{
Form1 loginPage = new Form1();
loginPage.Show();
this.Close();
}
The problem is here, you are creating a new instance of Form1 instead of opening it again:
Form1 loginPage = new Form1();
Here try this one:
private void button1_Click(object sender, EventArgs e)
{
var formToBeOpen = Application.OpenForms.OfType<Form1>().SingleOrDefault();
formToBeOpen.Show();
this.Close();
}
Now regarding your post, that if you close your Form2, your Form1 is still running on the background, because of this code:
this.Hide();
You just hide it, then open your Form2, then you click the X button on your Form2 which closes your Form2 but not necessarily mean will close your Form1 as well, since it's still running on the background. If you want to close your Form1, add this on your Form2 code:
private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
var formToBeOpen = Application.OpenForms.OfType<Form1>().SingleOrDefault();
formToBeOpen.Close();
}
i'll try to answer. because you declare a new instance in button logout. in form1 button put this code
private void button1_Click(object sender, EventArgs e)
{
Form2 x = new Form2(this);
x.Show();
this.Hide();
}
as form2, since i pass form1, put this code
public partial class Form2 : Form
{
Form form1;
public Form2(Form x)
{
InitializeComponent();
form1 = x;
}
private void button1_Click(object sender, EventArgs e)
{
this.Hide();
form1.Show();
}
}

C# Close Form1 Open Form2 Error

This question will definitely seem redundant but I've tried seemingly everything!
Ok I have form1 and form 2. I want to open form2 from buttonclick on form1 and have form1 close.
I've tried the:
Form2 newform = new Form2();
this.Close();
newform.Show();
I've tried moving the second line in all possible places inside the buttonclick function.
But my problem is that if I use the "this.Close();" command it closes both forms, if I use the "this.Hide();" command it leaves the process open and I have to manually close it to debug again.
The(this.Close();" works on any other form (ex. form2 close => open form3 ETC)
Does anyone know any other way to have it close it but not close the entire application?
I tried to use ApplicationContext in Program.cs.
Take a look at the below code. Form1 and Form2 both contain a Button.
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main ()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
MyApplicationContext context = new MyApplicationContext();
Application.Run(context);
}
public class MyApplicationContext : ApplicationContext
{
private Form1 form1 = new Form1();
public MyApplicationContext ()
{
form1 = new Form1();
form1.Show();
}
}
}
Below is the code for Form1
private void frm1Button1_Click (object sender, EventArgs e)
{
Form2 frm2 = new Form2();
frm2.Show();
this.Close();
}
And here is for Form2.
private void frm2Button1_Click (object sender, EventArgs e)
{
Form1 frm1 = new Form1();
frm1.Show();
this.Close();
}
The problem you are facing is that you cannot close the main form of an application (without closing the whole app). you need to rethink how your app is organized and maybe hide the main form while the other one is on the screen or something similar.

Open Form2 from Form1, close Form1 from Form2

Now, I have two forms, called form1 and form2, in the form1 there's a button, when I click it, then open the form2
Question: in the form2, I want to create a button when I click it, the form2 close and the form1 close. How to do?this
Form1:
private void button1_Click(object sender, EventArgs e)
{
Form2 frm = new Form2(this);
frm.Show();
}
Form2:
public partial class Form2 : Form
{
Form opener;
public Form2(Form parentForm)
{
InitializeComponent();
opener = parentForm;
}
private void button1_Click(object sender, EventArgs e)
{
opener.Close();
this.Close();
}
}
This works:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Me.Hide()
Form2.Show()
Your question is vague but you could use ShowDialog to display form 2. Then when you close form 2, pass a DialogResult object back to let the user know how the form was closed - if the user clicked the button, then close form 1 as well.
on the form2.buttonclick put
this.close();
form1 should have object of form2.
you need to subscribe Closing event of form2.
and in closing method put
this.close();
if you just want to close form1 from form2 without closing form2 as well in the process, as the title suggests, then you could pass a reference to form 1 along to form 2 when you create it and use that to close form 1
for example you could add a
public class Form2 : Form
{
Form2(Form1 parentForm):base()
{
this.parentForm = parentForm;
}
Form1 parentForm;
.....
}
field and constructor to Form2
if you want to first close form2 and then form1 as the text of the question suggests, I'd go with Justins answer of returning an appropriate result to form1 on upon closing form2
I did this once for my project, to close one application and open another application.
System.Threading.Thread newThread;
Form1 frmNewForm = new Form1;
newThread = new System.Threading.Thread(new System.Threading.ThreadStart(frmNewFormThread));
this.Close();
newThread.SetApartmentState(System.Threading.ApartmentState.STA);
newThread.Start();
And add the following Method. Your newThread.Start will call this method.
public void frmNewFormThread)()
{
Application.Run(frmNewForm);
}
//program to form1 to form2
private void button1_Click(object sender, EventArgs e)
{
//MessageBox.Show("Welcome Admin");
Form2 frm = new Form2();
frm.Show();
this.Hide();
}
private void button1_Click(object sender, EventArgs e)
{
Form2 m = new Form2();
m.Show();
this.Visible = false;
}

I would like to control Form1 from Form2

So I want basically the user to login in first in order to use the other form. However, my dilemma is that the login box is in Form2, and the main form is Form1.
if ((struseremail.Equals(username)) && (strpasswd.Equals(password)))
{
MessageBox.Show("Logged in");
form1.Visible = true;
form1.WindowState = FormWindowState.Maximized;
}
else
{
MessageBox.Show("Wow, how did you screw this one up?");
}
However, Form1 doesn't become visible, (since I launch it as visble = false) after they log in. Can someone help?
EDIT:
Brilliant response, but my problem is still here. I basically want to load Form2 First, (which is easy I run Form1 and set it to hide) But when Form2 is closed, I want Form1 to be closed as well.
private void Form2_FormClosing(Object sender, FormClosingEventArgs e)
{
Form1 form1 = new Form1();
form1.Close();
MessageBox.Show("Closing");
}
this doesn't seem to work...
You will need to pass the reference of one form to another, so that it can be used in the other form. Here I've given an example of how two different forms can communicate with each other. This example modifies the text of a Label in one form from another form.
Download Link for Sample Project
//Your Form1
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Form2 frm = new Form2(this);
frm.Show();
}
public string LabelText
{
get { return Lbl.Text; }
set { Lbl.Text = value; }
}
}
//Your Form2
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private Form1 mainForm = null;
public Form2(Form callingForm)
{
mainForm = callingForm as Form1;
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
this.mainForm.LabelText = txtMessage.Text;
}
//Added later, closing Form1 when Form2 is closed.
private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
mainForm.Close();
}
}
(source: ruchitsurati.net)
(source: ruchitsurati.net)
When you log in and do Form1.visible = true; have you also tried Form1.Show(); that should show form2
However, Personally, I would prefer setting the application to run form2 directly in the program.cs file.
static void Main()
{
Application.Run(new Form2());
}
then when user successfully logs in, do
form1.Show();
this.Hide(); // this part is up to you
mind you, in form2, when / after you instantiate form1, you might want to also add this :
newform1.FormClosed += delegate(System.Object o, FormClosedEventArgs earg)
{ this.Close(); };
this closes form2 when form1 is closed
better yet do form1.Show() in a new thread, and then this.Close(); for form2. this removes the need of adding to the form2's FormClosed event: you can thus close form2 immediately after starting form1 in a new thread. But working with threads might get a little complicated.
EDIT:
form2 is form1's parent. if form2 is your main application form, closing it closes your program (generally). Thus you either want to just hide and disable form2, and close it only after form1 is closed, or start form1 in a new thread. Your edit pretty much opens form1, then immediately closes it.

Categories