Message box closes form regardless of result - c#

i am new to message box buttons and it seems to close the form regardless.
private void btnFechar_Click(object sender, EventArgs e)
{
DialogResult = MessageBox.Show("Desjea Sair?", "Aviso", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (DialogResult == DialogResult.Yes)
{
this.Close();
}
}
thanks in advance

You're setting the DialogResult of the form (this looks like WinForms), which always closes it.
Create a local variable inside your button click event:
private void btnFechar_Click(object sender, EventArgs e)
{
var dialogResult = MessageBox.Show("Desjea Sair?", "Aviso", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (dialogResult == DialogResult.Yes)
{
this.Close();
}
}
More on Form.DialogResult from MSDN:
If the form is displayed as a dialog box, setting this property with a value from the DialogResult enumeration sets the value of the dialog box result for the form, hides the modal dialog box, and returns control to the calling form.
So if you're displaying the form using ShowDialog() as most of us do, then setting the form's DialogResult property causes it to close.

Related

How can I pervent a regular user from closing my GUI, in C#? [duplicate]

I have a C# GUI application. When the user clicks on the red 'X' (for closing the app) I want to show a message and ask if he really wants to close it.
I found a solution:
DialogResult dialog = MessageBox.Show("Do you really want to close the program?", "SomeTitle", MessageBoxButtons.YesNo);
if (dialog == DialogResult.Yes)
{
Application.Exit();
}else if (dialog == DialogResult.No)
{
//don't do anything
}
When the user clicks 'yes', the application should terminate completely. (Is Application.Exit() correct for this purpose?)
When the user clicks 'no', the DialogResult/MessageBox should close, but the application should stay opened. However, it closes!!
How can I avoid this?
BTW: I use Visual Studio 2010 and Winforms.
Use the FormClosing event from the Form, and the FormClosingEventArgs to cancel the process.
example:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
DialogResult dialog = dialog = MessageBox.Show("Do you really want to close the program?", "SomeTitle", MessageBoxButtons.YesNo);
if (dialog == DialogResult.No)
{
e.Cancel = true;
}
}
Use the form's FormClosing event of your program window. You can then set e.Cancel to true if the user clicks no:
this.FormClosing += (s, e) => {
DialogResult dialog = dialog = MessageBox.Show("Really close?", "SomeTitle",
MessageBoxButtons.YesNo);
if (dialog == DialogResult.No)
{
e.Cancel = true;
}
};
I guess you are using FormClosed. Are you? Then it's too late.
Try this
this.FormClosing += new FormClosingEventHandler(delegate(object sender, FormClosingEventArgs e)
{
if (MessageBox.Show("Do you really want to exit this application?", MessageBoxButtons:=MessageBoxButtons.YesNo) == DialogResult.No)
{
e.Cancel = true;
}
});
Refer to Mudu's answer.
Basically unless you specify additional parameters to MessageBox.Show() you cannot get any result other than DialogResult.Ok from a default MessageBox.
The code you posted (minus your little typo of dialog = dialog =) works exactly as expected to me.
Also: Application.Exit() IS the correct way of closing an application :)

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();
}

C# The exit message box pops up twice. I want to generate an event once.

bool ClosedFormMenu = false;
private void Cancel_btn_Click(object sender, EventArgs e)
{
DialogResult dialog = MessageBox.Show("Do you really want to close the program?", "program close", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if(dialog == DialogResult.Yes)
{
ClosedFormMenu = true;
Application.Exit();
}
}
private void Form_closing(object sender, FormClosingEventArgs e)
{
DialogResult dialog = MessageBox.Show("Do you really want to close the program?", "program close", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if(!ClosedFormMenu)
{
if (dialog == DialogResult.Yes)
{
Application.Exit();
}
else if (dialog == DialogResult.No)
{
e.Cancel = true;
return;
}
}
}
Press the X or Cancel button to display the exit message. Press 'Yes' on the message and it will appear again. I want to eliminate this phenomenon.
I would like to implement the program so that it will exit completely if I click cancel button or X button.
Answer Thanks in advance.
Thank you.
As soon as you call Application.Exit(), the event method Form_closing() will be called.
This is why your MessageBox appears twice.
You call it in the Cancel method, exit out of the application, the application calls Form_Closing() and the MessageBox appears again.
You should only call
Application.Exit();
in your Cancel_btn_Click Method.
You can reduce your code to the following:
private void Cancel_btn_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void Form_closing(object sender, FormClosingEventArgs e)
{
DialogResult dialog = MessageBox.Show("Do you really want to close the program?", "program close", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (dialog == DialogResult.No)
e.Cancel = true;
// TODO: Add 'else' if you want to call a cleanup
// method or do something before the application closes.
}
Why is 'return' missing in Form_closing()?
'return' is missing, because this is a method with the return type 'void'.
It is not expected to 'return' anything and since we do not need to exit out of the method prematurely, we do not need it.
Why is 'Application.Exit()' missing in Form_closing()?
The application has already received the command to exit. This is why it is closing the form. Therefor, we do not need it here.
Calling Application.Exit() from the button handler also calls Form_closing(). Having the dialog box in both the button handler and Form_closing() makes the question appear twice. Try this:
private void Cancel_btn_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void Form_closing(object sender, FormClosingEventArgs e)
{
DialogResult dialog = MessageBox.Show("Do you really want to close the program?", "program close", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (dialog == DialogResult.Yes)
{
e.Cancel = false;
}
else
{
e.Cancel = true;
}
}

prohibit user from closing the form

I have a main form called Form_Main, when somebody wants to close it, it will close the entire application (by entire application I mean quitting other forms as well). Therefore I prepared a yes/no MessageBox that ask users if they really want to quit the form. Here's where I'm at:
private void Form_Main_FormClosed(object sender, FormClosedEventArgs e)
{
DialogResult result = MessageBox.Show("Are you sure?", "Confirmation", MessageBoxButtons.OKCancel);
if (result == DialogResult.OK)
{
Environment.Exit(1);
}
else
{
//does nothing
}
}
The "OK" button works. But when users clicks "Cancel", Form_Main is closed, but the application is still running (other forms are untouched). What should I replace //does nothing with?
Use the FormClosing event (instead of FormClosed), and then set e.Cancel = true:
private void Form_Main_FormClosing(object sender, FormClosingEventArgs e)
{
var result = MessageBox.Show("Are you sure?", "Confirmation", MessageBoxButtons.OKCancel);
e.Cancel = (result != DialogResult.OK);
}
The FormClosing event occurs before the form actually closes, so you still have a chance to cancel it. By the time you get to the FormClosed event, it's too late.

Ask the user before closing C# WPF application

I want to ask the user before closing the application.
I'm using C# .NET 4.0 WPF. I can do it in windows forms, but not in WPF.
Event is fired when the user want to close the app. Message box appears, bun no matter which button is pressed (Yes or No) the application always closes. Why? Where is the mistake?
It works, but only when the user presses the "X". When the user presses the close button with Application.Current.Shutdown(); it is not working.
private void MainWindowDialog_Closing(object sender,
System.ComponentModel.CancelEventArgs e)
{
MessageBoxResult result = MessageBox.Show("Do you really want to do that?",
"Warning", MessageBoxButton.YesNo, MessageBoxImage.Question);
if (result == MessageBoxResult.No)
{
e.Cancel = true;
}
}
The Closing event cannot be cancelled if you call Application.Current.Shutdown(). Just call the Window.Close() method instead, which will give you a chance to veto the close operation. Once all your program's windows have closed the application will shutdown automatically.
For more information checkout the Application Management page on MSDN.
Just call YourMainWindow.Close() and use the Closing event as described before.
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (MessageBox.Show("Are you sure to exit?", "Exit", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
e.Cancel = false;
else
e.Cancel = true;
}
Why don't you just ask the user whether he wants to close the application, and then call Application.Current.Shutdown() like this:
private void closeButton_Click(object sender, RoutedEventArgs e)
{
if (MessageBox.Show("Do you want to exit?", "Confirm",
MessageBoxButton.YesNo) == MessageBoxResult.Yes)
{
Application.Current.Shutdown();
}
}

Categories