Troubles with onFormClosing in c# - c#

I'm trying to implement some code that asks if the user wants to exit the application I've made.
It's in c# and is a windows form application.
I've had very little sleep this week and can't seem to get my head around the onFormClosing event. Could some please give me the exact code I should use to have code executed when the user clicks on the close button (the 'x' in the top right).
Please find it in your heart to help a sleep deprived moron.

Double-click the form's FormClosed event in the events tab of the Properties window in the designer.
The FormClosing event allows you to prevent the form from closing by setting e.Cancel = true.

Well, the event is called FormClosing and is cancellable. Subscribe to it, do your stuff and let the user close their form. This event is fired if the "x" button is used or if you close the form yourself.
You can subscribe to it in the designer by highlighting the form and looking in the events tab of the properties window, as SLaks says, then double-click it. You don't need to do anything special to cope with the "x" button.

The easiest way is to activate the form in the designer and find the event FormClosing in the properties windows and then just double click the event.
Then just do the following:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (e.CloseReason == CloseReason.UserClosing)
{
var result = MessageBox.Show("Are you sure you want to exit?", "Exit", MessageBoxButtons.YesNo);
if (result != System.Windows.Forms.DialogResult.Yes)
{
e.Cancel = true;
}
}
}
If you do not specify that the reason has to be UserClosing, it will stop windows from shutting down if you do not exit the program first which is not a good practice.

public Form1()
{
InitializeComponent();
this.FormClosing += new FormClosingEventHandler(Form1_FormClosing);
}
void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (MessageBox.Show("Are you sure that you wan't to close this app", "Question", MessageBoxButtons.OKCancel) == DialogResult.Cancel)
e.Cancel = true;
}
I hope this helps

You can add event handler manually. Example to add event handler in constructor:
public frmMain()
{
InitializeComponent();
FormClosing += frmMain_FormClosing;
}
private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
{
//your code
}

Make derive your form fromf the System.Windows.Forms.Form and put this override:
protected override void OnFormClosing(CancelEventArgs e)
{
if (bWrongClose)
{
bWrongClose = false;
e.Cancel = true; // this blocks the `Form` from closing
}
base.OnFormClosing(e);
}

Related

Close button initiates main_load event

I have multiple forms in my WinForm application.
The first form (Form1) is used for authentication, while the second (Main) is used as main dashboard for the application that opens additional forms.
When I am in designer mode, I double click on the close button within the Main form to generate the closing event, but something weird occurs.
Instead of:
private void Main_FormClosing(object sender, FormClosingEventArgs e)
The event that the click generates is:
private void Main_Load(object sender, EventArgs e)
I don't understand why.
I've tried to type the method manually as shown bellow:
private void Main_FormClosing(object sender, FormClosingEventArgs e)
{
DialogResult dialog = MessageBox.Show("Do you really want to quit?", "Exit", MessageBoxButtons.YesNo);
if (dialog == DialogResult.Yes)
{
Application.Exit();
} else if (dialog == DialogResult.No)
{
e.Cancel = true;
}
}
But its simply not linked to the close button.
Any ideas why?
You need to find and delete the event assignment for the Main form Close buttton's click event. That code is going to be in the Main.Designer.cs module. Look for all instances of this code:
this.FormClosing += ...
Delete that assignment (or those assignments, if more than one), then go back to the form designer, double-click the Main form's close button, and Visual Studio will create and take you to the method handler for the FormClosing event.
In the form constructor for Main() you can bind an event handler for the FormClosing event like so.
public Main()
{
// other startup tasks here
this.FormClosing += Main_FormClosing;
}
private void Main_FormClosing(object sender, FormClosingEventArgs e)
{
var dialogResult = MessageBox.Show("Do you really want to quit?", "Exit", MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.No)
{
e.Cancel = true;
return;
}
Application.Exit();
}

notifyIcon always visible even if application is closed

Is there any way to run the application on the background even if the application/form is closed. All i can do now is just minimize it.
private void Form2_Resize(object sender, EventArgs e)
{
if (WindowState == FormWindowState.Normal)
{
Hide();
WindowState = FormWindowState.Minimized;
}
else if (FormWindowState.Normal == this.WindowState)
{
Show();
}
}
If your application (your process) is closed, the notify icon will disappear. There is no way to avoid that.
So what you probably want is to keep your application running even if the user closes your Form. One way to achieve this is to actually not close the form but just hide it.
Therefor you need to subscribe to the Closing event of the Form:
public class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.Closing += Form1_Closing;
}
}
and implement the event handler like this:
void Form1_Closing(object sender, FormClosingEventArgs e)
{
Hide();
e.Cancel = true;
}
By setting e.Cancel = true you tell the form not to close. So you are just hiding it.
You'll need to add some code to your notify icon to reopen (Show()) the form again.

why this.close() close application

I have a window in wpf that i want on the escape button to close the window. So i wrotethis code on PreviewKeyDown event, but it closes the entire application, including the main window and current window. I just want to close current window.
//this code for open second window
private void M_Mahale_Click(object sender, RoutedEventArgs e)
{
Tanzimat.MahaleWin Mahale = new Tanzimat.MahaleWin();
Mahale.ShowDialog();
}
//this code for PreviewKeyDown event on second window and current window
private void Window_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Escape)
{
this.Close();
}
}
OK, based on this comment //this code for PreviewKeyDown event on second window and current window you have the same code in both windows in the PreviewKeyDown -so in both windows change the code to this:
private void Window_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Escape)
{
e.Handled = true;
this.Close();
}
}
and that will keep other windows from getting the event when it's been handled already. See, what's happening is when the escape key is pressed both windows are getting the message, and you didn't tell the main window (i.e. the one behind the current one) not to process it.
You window has a name Mahale and or order to close it from the main window, you should call:
Mahale.Close();
If you call this.Close(); in main form it is quite natural for the program to exit
You can use this.Hide() to hide that window, but that window still exists.
I think the best way to achieve your goal is using of Button's IsCancel property.
You can set the IsCancel property on the Cancel button to true,
causing the Cancel button to automatically close the dialog without
handling the Click event.
See here for examples.
do :
private void Window_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Escape)
{
this.Hide();
}
}
instead.
Close() close every frames. Use hide().

How do I catch the event of exiting a Winforms application?

If the user wants to exit the application by clicking on the exit icon or by ALT+F4, I'd like to make a dialog box questioning the user if he/she is really sure about exiting.
How do I capture this event before the application is actually closed?
Check out the OnClosing event for the form.
Here is an extract from that link actually checks for a change on a text field and prompts a save:
private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
// Determine if text has changed in the textbox by comparing to original text.
if (textBox1.Text != strMyOriginalText)
{
// Display a MsgBox asking the user to save changes or abort.
if(MessageBox.Show("Do you want to save changes to your text?", "My Application",
MessageBoxButtons.YesNo) == DialogResult.Yes)
{
// Cancel the Closing event from closing the form.
e.Cancel = true;
// Call method to save file...
}
}
}
You can change the text to suit your needs, and then also I think you might want to switch the DialogResult.Yes to DialogResult.No based on your text.
Here is some modified code just for you:
private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
if(MessageBox.Show("Are you sure you want to quit?", "My Application", MessageBoxButtons.YesNo) == DialogResult.No)
{
e.Cancel = true;
}
}
You should subscribe to the Form_Closing event
Post a dialog box there, and if user abort the closing set the FormCloseEventArgs.Cancel to true.
For example in the Form_Load or using the designer, subscribe the event
Form1.FormClosing += new FormClosingEventHandler(Form1_Closing);
....
private void Form1_FormClosing(Object sender, FormClosingEventArgs e)
{
DialogResult d = MessageBox.Show("Confirm closing", "AppTitle", MessageBoxButtons.YesNo );
if(d == DialogResult.No)
e.Cancel = true;
}
Depending on the situation is not always a good thing to annoy the user with this kind of processing.
If you have valuable modified data and don't want the risk to loose the changes, then it is always a good thing to do, but if you use this only as a confirm of the close action then it's better to do nothing.
You can handle the Form_Closing or Form_Closed events for this.
In Visual Studio click the lightning bolt icon and scroll down to these events in the form properties list. Double click on the one you want and it will hook up the event for you.
Read msdn sample: http://msdn.microsoft.com/en-us/library/system.windows.forms.form.closing.aspx
Is this just one form? If so, you might want to use the FormClosing event, which allows you to cancel it (show the dialog, then set CancelEventArgs.Cancel to true if the user chooses to cancel closing).
If you're talking about windows forms, should be enough to catch your MainWindow's
FormClosing event and in case you want prevent closing, just set the argument of the event handler got fired, to true.
Example:
private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
if(MessageBox.Show("Do you really want to exit?", "My Application",
MessageBoxButtons.YesNo) == DialogResult.No){
// SET TO TRUE, SO CLOSING OF THE MAIN FORM,
// SO THE APP ITSELF IS BLOCKED
e.Cancel = true;
}
}
}

Visual C#: Exit the Program Check

In Visual C#, how can I detect if the user clicks the X button to close the program? I want to ask the user if they'd like to perform a certain action before exiting. I have an exit button in my program itself, and I know I can code it as follows:
private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
DialogResult result;
if (logfiletextbox.Text != "")
{
result = MessageBox.Show("Would you like to save the current logfile?", "Save?", MessageBoxButtons.YesNo, MessageBoxIcon.Asterisk);
if (result == DialogResult.Yes)
{
savelog.PerformClick();
}
}
Environment.Exit(0); //exit program
}
But how can I do this for the X button that is already built into the program?
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (MessageBox.Show("cancel?", "a good question", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
e.Cancel = true;
}
}
It's the "FormClosing" - event of the form. Have fun, friend.
Add an event handler for FormClosing on the form.
The Form designer will do this for you automatically if you select the event, but to do it manually:
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Main_FormClosing);
And then add the handler into your code:
private void Main_FormClosing(object sender, FormClosingEventArgs e)
{
//Code here
}
If you don't want to close the form then you can set:
e.Cancel = true;
There is a FormClosing event you can bind to that gets fired when the form is about to close. The event handler includes a link to the reason the form is closing (user action, OS shutdown, etc), and offers you an option to cancel it.
Check out the MSDN article here: http://msdn.microsoft.com/en-us/library/system.windows.forms.form.formclosing.aspx
use the Application.Exit or Form.Closing event. Exit won't let you cancel, so Closing is probably a better choice
Just use FormClosing event of form
If you're using a form, you can catch the Form.FormClosing event.
It can be cancelled by setting the Cancel property in the args, based on user input.

Categories