When displaying a Form as a Dialog/Modal Box sometimes you may need to avoid the Dialog form to close.
Let’s say we have a main form that displays another form as a Modal dialog to finally display some information from that form.
Here is the code for the “Choose your favorite pet” Dialog form:
public partial class ChoosePetDialogForm : Form
{
public string ChosenPet { get; private set; }
public ChoosePetDialogForm()
{
InitializeComponent();
ChosenPet = "Nothing";
}
private void choosePetButton_Click(object sender, EventArgs e)
{
var petRadioChecked = this.petListGroup
.Controls
.OfType<RadioButton>()
.FirstOrDefault(r => r.Checked);
if (petRadioChecked != null)
{
ChosenPet = petRadioChecked.Text;
}
}
}
The choosePetButton is associated to a DialogResult of value DialogResult.OK:
That makes the ChoosePetDialogForm “return” the value DialogResult.OK when called as a Dialog Box when the choosePetButton is clicked.
And the code for the caller form:
public partial class PetTestForm : Form
{
public PetTestForm()
{
InitializeComponent();
}
private void takeTestButton_Click(object sender, EventArgs e)
{
ChoosePetDialogForm dialog = new ChoosePetDialogForm();
if (dialog.ShowDialog() == DialogResult.OK)
{
MessageBox.Show(dialog.ChosenPet, "Pet Chosen:");
}
}
}
Let’s say now that I want to make some validation before the Modal Dialog form closes, for example allow only “platypus” as favorite pet. How can I make the modal dialog to continue running after clicking a button?
if (!radioButtonPlatypus.Checked)
{
// avoid the modal dialog to close
}
Well, as explained on the DialogResult Enumeration documentation, we simply need to set the DialogResult property value of the Modal form to DialogResult.None.
if (!radioButtonPlatypus.Checked)
{
// avoid the modal dialog to close
this.DialogResult = DialogResult.None;
MessageBox.Show("Wrong pet! Try again.");
}
This way the Modal form will not close.

