Detect when newly created form is closed - c#

I have Form1 and its my main form.
In some part of my code, I do this:
Form2 f2=new Form2();
f2. ShowDialog()
I want to do following: In Form1, I want to detect when the Form2 closed and do some stuff in that case?
How to do that?

First of all you need to change your .ShowDialog(); to .Show(this); as your code after calling second form would be run after form closed.
You should create a new method for Closing event like this:
private void FormIsClosing(object sender, FormClosingEventArgs e)
{
// Some stuff you want to do on close
}
Then somewhere where you create your Form2 you need to assign this method to Closing event. Do it like this:
var f2 = new Form2(); // Create a form
f2.FormClosing += new System.Windows.Forms.FormClosingEventHandler(FormIsClosing); // Add event handler
f2.Show(this); // Run this form
This should do the trick

try this:
private void button1_Click(object sender, EventArgs e)
{
Form2 f2=new Form2();
f2.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.Form2_FormClosed);
f2.ShowDialog();
}
void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
MessageBox.Show("my code");
}

I want to do following: In Form1, i want to detect when the Form2 closed and do some stuff in that case?
"Detection" is not necessary as you are using a modal dialog. You could add an intercept in the dialog class but unless you want to prevent closure, simply perform the following.
Change:
Form2 f2=new Form2();
f2.ShowDialog()
...to:
Form2 f2=new Form2();
f2.ShowDialog(); // this will block your app until Form2 closes
// If we get here, then it means Form2 has closed
// Add your code here
// ...
// ...
// ...

Related

Form remains open in the background after closing it

So I want to show a form and close the other form so I did this in form1:
private void newTaskToolStripMenuItem_Click(object sender, EventArgs e)
{
Form2 x = new Form2();
x.Show();
this.Hide();
//didn't use this.close() cause then the whole program will close instead of
//just the current form
}
Then I wanted the main form to open again after the 2nd form is closed so I did this in form2:
private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
Form1 x = new Form1();
x.Show();
}
Now the problem is when I'm back in the main form after closing the 2nd form. if I close the main form it doesn't fully close and still remains open in the background (I found it in task manager). I think its because the "show" method just opens another form instead of making the form appear so the main form which got hidden is still there running in the background.
what should I do to make the form get closed when I exit it?
I tried putting this.close(); in the form closed and form closing event but both resulted in a crash.
When you write:
Form1 x = new Form1();
you are creating a new Form1 object, so x refers to the new one and not to the original one. Instead, you could use this:
private void newTaskToolStripMenuItem_Click(object sender, EventArgs e)
{
using (var form2 = new Form2())
{
this.Hide();
form2.ShowDialog();
}
this.Show();
}
When ShowDialog() is called, the code following it is not executed until after the dialog box is closed, so this.Show() will execute only after Form2 is closed.
Another option is to simply subscribe to the FormClosed() event of Form2 when you create it, then un-hide your instance of Form1 from there:
// ... all in Form1 ...
private void newTaskToolStripMenuItem_Click(object sender, EventArgs e)
{
this.Hide();
Form2 x = new Form2();
x.FormClosed += X_FormClosed;
x.Show();
}
private void X_FormClosed(object sender, FormClosedEventArgs e)
{
this.Show();
}
So then when you close Form2 your instance of Form1 will automatically re-appear.

How to Focus to another form in C#

I have a program which opens two forms
and I want when I click on Form1
then Focus on Form2.
private void Form1_Click(object sender, EventArgs e)
{
Form2 frm2 = new Form2();
frm2.Focus();
}
But this doesn't work, what's wrong in my code?
EDIT:
I found already answered Here by #moguzalp at the comments
First of all that Form2 is never visible.
private void Form1_Click(object sender, EventArgs e)
{
Form2 frm2 = new Form2();
frm2.Show();
frm2.Focus();
}
If that Form is visible though with your code, that means you need to get same reference and call Focus() against it.
EDIT:
Then you need to have a reference to that Form.
At some point you created that Form and assigned it to a vairable/field or anything like that.
You need to call Focus or Activate against it.
Example:
Inside Form1 when you create a Form2 instance:
public class Form1 : Form
{
private Form _frm2;
//That code you probably have somewhere. You need to make sure that this Form instance is accessible inside the handler to use it.
public void Stuff() {
_frm2 = new Form2();
_frm2.Show();
}
private void Form1_Click(object sender, EventArgs e)
{
_frm2.Focus(); //or _frm2.Activate();
}
}
If you can have a form opened, try finding it:
using System.Linq;
...
// Do we have any Form2 instances opened?
Form2 frm2 = Application
.OpenForms
.OfType<Form2>()
.LastOrDefault(); // <- If we have many Form2 instances, let's take the last one
// ...No. We have to create and show Form2 instance
if (null == frm2) {
frm2 = new Form2();
frm2.Show();
}
else { // ...Yes. We have to activate it (i.e. bring to front, restore if minimized, focus)
frm2.Activate();
}
If you want to Show your frm2, you should call frm2.Show(); or frm2.ShowDialog();.
Also, before 'Show' call you can set frm2.TopMost = true; if you want this form to be on the top.
So it could be:
private void Form1_Click(object sender, EventArgs e)
{
Form2 frm2 = new Form2();
frm2.TopMost = true;
frm2.Show();
}
If you already opened the form elsewhere, then this code will not work as it's a new instance of Form2 and not the one that is opened.
You will have to keep a reference to the form that is opened, and then use Focus or might be better Activate on it.
if the form is opened from within Form1 then:
Add a field for holding current reference of Form2
Save it when showing the form.
Use it when focusing
private Form2 currentForm2;
....
this.currentForm2 = new Form2();
this.currentForm2.Show();
...
...
this.currentForm2.Activate();

How can I close the MainForm, without closing the others?

So, I'm writing a Hangman, and at the MainForm you have to choose if you want to play single player or multiplayer. When I choose which one I want, this MainForm should close( I use this.Close() ) and trigger another Form, but instead the entire program shuts down.
private void button2_Click(object sender, EventArgs e)
{
Form f2 = new Form1();
f2.Show();
this.Close();
}
If in Programs.cs I modify the code like this:
Form f4 = new Form4();
f4.Show();
Application.Run();
everything goes well, but If I won't exit the program using Application.Exit(), it will still run in the background.
So, how could I solve this problem?
You can't close the parent form and keep the children alive.
Use this.Hide() instead of this.Close()
Then on the Form2_FormClosed Event you can do Application.Exit()
or you can even show the MainForm Again.
OR:
Form2 f2 = new Form2();
this.Visible = false;
f2.ShowDialog();
this.Close();
If you want a basic form that will pretty much just allow the user to play until they close the other form then close this form, use this:
private void button2_Click(object sender, EventArgs e)
{
Form f2 = new Form1();
this.Hide();
f2.ShowDialog();
this.Close();
}
or something a bit more fancy will allow you to close the form if the user selects something like not wanting to play another game or change difficulty settings or whatever. You can do that like this:
private void button2_Click(object sender, EventArgs e)
{
Form f2 = new Form1();
this.Hide();
if(f2.ShowDialog() == DialogResult.OK)
{
this.Show();
}
else
{
this.Close();
}
}
You can show (dialog) your form before Application.Run(new MainForm()), so you don't need to close the Mainform

Close two form by one click?

I'm working on project with sign in feature
When I run the project there is a form (form1) run the sign in .
after i click on login button build another form (form2) - It's the form of my program .
and made the first form (form1) hide .
The problem is when I press at the X button in form2 it's close but the form1 it's still running .
I tried to close the form1 instead of hide ... but this will close form2 before launching
In form1:
this.Hide();
Form2 x = new Form2();
x.Show();
I think you have your forms around the wrong way.
Form1 sould be your app and shold show Form2 as a dialog when it first loads, then when it closes you can process the result and decide wether to continue or close the application.
Something like:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Load += new EventHandler(Form1_Load);
}
void Form1_Load(object sender, EventArgs e)
{
Form2 myDialog = new Form2();
if (myDialog.ShowDialog() == System.Windows.Forms.DialogResult.Cancel)
{
// failed login
// exit application
}
// all good, continue
}
}
You could subscribe to the child forms FormClosed event and use that to call Close on the parent form.
x.FormClosed += new FormClosedEventHandler(x_FormClosed);
void x_FormClosed(object sender, FormClosedEventArgs e)
{
this.Close();
}
try this, in the log in button if access is granted
private void logInBtn_Click(object sender, EventArgs e)
{
Form2 frm = new Form2();
frm.ShowDialog();
this.Hide();
}
then in form2 if you want to exit
private void exitBtn_Click(object sender, EventArgs e)
{
Application.Exit();
}
hope this helps.
You go to your form2 then in the event of the form look for FormClosed.
Put this code in your eventhandler:
private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
Application.Exit();
}
FormClosed is the event whenever the user closes the form. So when you close the form put a code that will exit your application that is -applicationn.exit();-
Hope this will work.

detecting in form1 that form2 is closed

I am trying to detect that form2 is closed in form1. I have this so far
private void AddStageBtn_Click(object sender, EventArgs e)
{
Form2 form2 = new Form2();
form2.ShowDialog();
if (form2.IsDisposed)
{
MessageBox.Show("it was closed!");
}
}
Any suggestions? Thanks again!
Adhere to the FormClosed event of form2.
Wherever you create it do:
form2.FormClosed += new FormClosedEventHandler(form2_FormClosed);
Then create the method:
void form2_FormClosed(object sender, FormClosedEventArgs e)
{
// Do whatever you want here
}
You'll also want to use .Show() instead of .ShowDialog() if you want to be able to use either form, otherwise form1 will be unavailable until form2 is closed (which I am assuming is not the behavior you are looking for).
In this particular situation
private void AddStageBtn_Click(object sender, EventArgs e)
{
Form2 form2 = new Form2();
form2.ShowDialog();
MessageBox.Show("it was closed!");
}
will work fine. If you want to be able to do action within form1 while form2 is open you need to use Show instead of ShowDialog. Then you can create a handler for form closed within form1.
form2.FormClosed += new FormClosedEventHandler(form2_FormClosed);

Categories

Resources