I am using C# here. I have a form where the user can select Yes or No, and if they choose No, a message box appears and asks them if they are sure. If they click No, I want to show the form again. Here's my code:
public void function()
{
MyForm form = new MyForm();
if (form.ShowDialog() == DialogResult.No)
{
if (MessageBox.Show("Are you sure?",
MessageBoxButtons.YesNo) == DialogResult.Yes)
{
runFinished.Dispose();
return;
}
else
{
//Show form again. How??
}
}
}
Thanks everybody for your help!
Arrange that the No button MyForm does the call to MessageBox. Only if the user is sure do you then go on to close the dialog. Your current approach of asking the question after the dialog has closed is incorrect.
You can effect the change by making sure that DialogResult is set in code rather than by the No button's DialogResult property. Then in the click handler for the button you run the message box. If the user confirms the action, then set the forms DialogResult to DialogResult.No.
Call two events depending on whether no or yes is selected (within MyForm). For example
void OnNoEvent(object sender, EventArgs e)
{
if (MessageBox.Show("Are you sure?", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
this.DialogResult = DialogResult.No;
this.Close();
}
}
void OnYesEvent(object sender, EventArgs e)
{
this.DialogResult = DialogResult.Yes;
this.Close();
}
This is probably better than opening the dialog box many times.
Then the code to open the dialog is easy.
MyForm form = new MyForm();
if (form.ShowDialog() == DialogResult.No)
// perform actions here
There is the standart means: Form.FormClosing.
See example: example
Maybe I am missing something here, but why not use a while loop?
public void function()
{
MyForm form = new MyForm();
while(form.ShowDialog() == DialogResult.No)
{
if (MessageBox.Show("Are you sure?",
MessageBoxButtons.YesNo) == DialogResult.Yes)
{
runFinished.Dispose();
return;
}
}
}
Related
Here is my C# code:
private void StudentReg_FormClosing(object sender, FormClosingEventArgs e)
{
DialogResult dialog = MessageBox.Show("Do you really want to close this window?", "Exit", MessageBoxButtons.YesNo);
if (dialog == DialogResult.Yes)
{
Application.Exit();
}
else if (dialog == DialogResult.No)
{
e.Cancel = true;
}
}
Depending on how you setup your application like if this is your main form or you have multiple you may need to just remove the event to avoid duplicate calls to it.
Remove the event handler before calling application.exit and I think your issue will be solved.
This is psuedo-code.
private void StudentReg_FormClosing(object sender, FormClosingEventArgs e)
{
DialogResult dialog = MessageBox.Show("Do you really want to close this window?", "Exit", MessageBoxButtons.YesNo);
if(dialog == DialogResult.Yes)
{
StudentReg.FormClosing -= StudentReg_FormClosing;
Application.Exit();
}
else if(dialog == DialogResult.No)
{
e.Cancel = true;
}
}
I doubt if you really want Application.Exit();: you prompt (bold is mine)
Do you really want to close this window
It is the window (Form), not the entire Aplication you want to close. If it's your case, you can just do nothing and let the form (window) close itself:
private void StudentReg_FormClosing(object sender, FormClosingEventArgs e)
{
// Cancel closing (i.e. do NOT close the form) if and only if user's chosen "No".
// Do nothing (i.e. do not cancel) in other cases (let the form be closed)
// So we assign true (cancel) if "No" has been pressed, false otherwise
e.Cancel = MessageBox.Show(
"Do you really want to close this window?",
"Exit",
MessageBoxButtons.YesNo) == DialogResult.No;
}
I'm writing a WinForm desktop application. In the main form, the user clicks on a button which calls another form for the user to submit data to. At the end of this submission process, the user clicks on a "Save" menu item to close the subform.
This is the code for the subform calling:
private void btnSubmit_Click(object sender, EventArgs e)
{
// code for setting myFormArgs
myForm form = new myForm(myFormArgs);
form.ShowDialog();
// the user clicked "Yes" on a "Confirm" MessageBox
if (form.DialogResult == DialogResult.Yes)
{
// code for saving data
form.Dispose();
}
}
and this is the code for the "Save" menu item in the subform:
private void menuSave_Click(object sender, EventArgs e)
{
string message, title;
MessageBoxIcon icon;
MessageBoxButtons buttons;
if(DataSubmitted)
{
if(ValidData)
{
message = "Confirm?";
title = "Select an action";
icon = MessageBoxIcon.Information;
buttons = MessageBoxButtons.YesNo;
}
else
{
message = "Incomplete data";
title = "Error";
icon = MessageBoxIcon.Error;
buttons = MessageBoxButtons.OK;
}
}
else
{
message = "No data submitted";
title = "Error";
icon = MessageBoxIcon.Error;
buttons = MessageBoxButtons.OK;
}
this.DialogResult = MessageBox.Show(message, title, buttons, icon);
if (this.DialogResult == DialogResult.Yes) this.Close();
else this.OnFormClosing(new FormClosingEventArgs(CloseReason.None, true));
}
The problem is that the code will always get back to the calling method, thus closing (maybe just hiding?) the sub-form, even if the this.Close() method isn't called.
Thanks in advance.
you should not make a new event instance, those are things you would want to avoid
instead try:
DialogResult dialogResult = MessageBox.Show("Sure", "Some Title",
MessageBoxButtons.YesNo);
if(dialogResult == DialogResult.Yes)
{
Close();
}
Events are supposed to occur automatically, so 'OnFormClosing' will raise when the form will close.
also i recommend to use this.Close instead of Dispose
Form.Close() sends the proper Windows messages to shut down the win32 window. During that process, if the form was not shown modally, Dispose is called on the form. Disposing the form frees up the unmanaged resources that the form is holding onto.
for more organized code,
try making an instance of the form from the main form
and handle the dialog result like this:
using (SubForm form = new SubForm())
{
DialogResult dr = form.ShowDialog();
if(dr == DialogResult.Yes)
{
string studdToSave= form.StuffToSave;
SaveToFile(studdToSave);
}
}
I find it strange that you want to close the form when the user just wants to save the data. :)
Save should not close your form.
When you close the form, you should verify if there are unsaved changes.
If there are, ask the user the question if he wants to save his changes before closing and offer him the options Yes, No and Cancel, where Cancel means 'cancel closing the form'.
Depending on wether the user clicked Yes or No, you should or shouldn't save the changes.
If the user clicked cancel, you should cancel closing the form by having an event for the FormClosing event. This event allows you to cancel closing the form.
private void btnClose_Click(object sender, EventArgs e)
{
if (unsavedChanges)
{
var result = MessageBox.Show("Save changes?", "unsaved changes", MessageBoxButtons.YesNoCancel);
if (result == DialogResult.Yes)
{
SaveChanges();
}
if (result == DialogResult.Cancel)
{
cancelClose = true;
}
this.Close();
}
}
private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
e.Cancel = cancelClose;
cancelClose = false;
}
The code above is usefull when 'Form2' is not a modal form.
If you want Form2 to be shown modal, the code above will work as well. However, you can also use the DialogResult proprety of the Form in that case:
private void btnClose_Click(object sender, EventArgs e)
{
if (unsavedChanges)
{
var result = MessageBox.Show("Save changes?", "unsaved changes", MessageBoxButtons.YesNoCancel);
if (result == DialogResult.Yes)
{
SaveChanges();
}
if (result == DialogResult.Cancel)
{
result = DialogResult.None;
}
this.DialogResult = result;
}
}
i am pretty newbie for coding. Here is i am having a problem:
private void pano_FormClosing(object sender, FormClosingEventArgs e)
{
DialogResult dialog = MessageBox.Show("Uygulamadan çıkış yapmak istediğinizden emin misiniz?", "Çıkış", MessageBoxButtons.YesNo);
if (dialog == DialogResult.Yes)
{
Application.Exit();
}
else if (dialog == DialogResult.No)
{
e.Cancel = true;
}
My purpose with this code block to ask user "are sure to quit" but unfortunetly when i close the application, i got notification window for 3 times? Is there any idea why thats happening or any solution?
Thanks a lot.
Nuri.
Firstly, as Steve pointed out, remove the 'Yes' part - if not explicitly canceled, the event will close that form as a result of clicking.
Now, for the problem of yours. Seems like your alert is called twice. I was able to solve that easily by making a static bool close_alert_shown, and when the first alert is shown, set it to true so that the next alert won't pop up.
Final code looks like that:
if (close_alert_shown) return;
close_alert_shown = true;
DialogResult dialog = MessageBox.Show("Uygulamadan çıkış yapmak istediğinizden emin misiniz?", "Çıkış", MessageBoxButtons.YesNo);
if (dialog == DialogResult.No)
{
e.Cancel = true;
close_alert_shown = false;
}
And on the top of the form (before the public Form1() contructor line):
static bool close_alert_shown = false;
What i suspect is when application is exiting, it is again calling form closing since we have subscribed for that event. I assume, simple fix would be unsubscribe from the event before calling exit.
this.FormClosing-=Form1_FormClosing;
Application.Exit();
Upon closing the form by clicking on the button I created named 'Exit' I want it to display a messagebox asking the user "Are you sure you want to exit?" I don't know the syntax for it, can someone help me please? Thanks
You need to look at the Form. closing event. You can place your message box there and then if you want to abort the form closing set e.cancel = true.
if (MessageBox.Show("Are you sure?", "Exit Application?",
MessageBoxButtons.YesNo) == DialogResult.No)
{
// ignore it
}
else
{
// shutdown code goes here
}
There's an MSDN example here.
Have you tried something like:
private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
if(MessageBox.Show("Exit Application?", "", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
this.Close();
}
}
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 :)