web-dev-qa-db-fra.com

Empêcher une boîte de dialogue de se fermer dans le gestionnaire d'événements de clic du bouton

J'ai un dialogue que je montre avec <class>.ShowDialog(). Il a un bouton OK et un bouton Annuler; le bouton OK a également un gestionnaire d'événements.

Je souhaite effectuer une validation d'entrée dans le gestionnaire d'événements et, en cas d'échec, informer l'utilisateur avec une boîte de message et empêcher la fermeture de la boîte de dialogue. Je ne sais pas comment faire la dernière partie (empêcher la fermeture).

60
qster

Etant donné que vous avez spécifié que vous voulez une boîte de dialogue d'erreur contextuelle, vous pouvez notamment déplacer votre validation dans un gestionnaire d'événements OnClosing . Dans cet exemple, la fermeture du formulaire est annulée si l'utilisateur répond oui à la question dans la boîte de dialogue.

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...
      }
   }
}

En définissant e.Cancel = true, vous empêcherez la fermeture du formulaire.

Cependant, il serait préférable de présenter les erreurs de validation inline (en mettant en surbrillance les champs incriminés, en affichant des info-bulles, etc.) et en empêchant l'utilisateur de sélectionner le bouton OK dans le menu contextuel. première place.

42
ChrisF

Vous pouvez annuler la fermeture en définissant la variable DialogResult du formulaire sur DialogResult.None.

Un exemple où button1 est AcceptButton:

private void button1_Click(object sender, EventArgs e) {
  if (!validate())
     this.DialogResult = DialogResult.None;
}

Lorsque l'utilisateur clique sur button1 et que la méthode validate renvoie false, le formulaire ne sera pas fermé.

128
Arjan

N'utilisez pas l'événement FormClosing pour cela, vous voudrez autoriser l'utilisateur à fermer la boîte de dialogue avec Annuler ou en cliquant sur le X. Implémentez simplement le gestionnaire d'événements Click du bouton OK et ne fermez pas tant que vous n'êtes pas satisfait:

private void btnOk_Click(object sender, EventArgs e) {
  if (ValidateControls())
    this.DialogResult = DialogResult.OK;
}

Où "ValidateControls" est votre logique de validation. Renvoie false s'il y a quelque chose qui ne va pas.

16
Hans Passant

Utilisez ce code:

private void btnOk_Click(object sender, EventArgs e) {
  if (ValidateControls())
    this.DialogResult = DialogResult.OK;
}

Le problème est que l'utilisateur doit cliquer deux fois sur les boutons pour fermer les formulaires;

3
cigos emmanuel

Cela ne répond pas directement à votre question (les autres l'ont déjà fait), mais du point de vue de la convivialité, je préférerais que le bouton incriminé soit désactivé lorsque l'entrée n'est pas valide.

3
Benjol

Vous pouvez intercepter FormClosing et forcer le formulaire à rester ouvert . Utilisez la propriété Cancel de l'objet argument argument pour cela.

e.Cancel = true;

et cela devrait empêcher votre formulaire de se fermer.

2
Adrian Fâciu
void SaveInfo()
{
blnCanCloseForm = false;
Vosol[] vs = getAdd2DBVosol();
if (DGError.RowCount > 0)
return;

Thread myThread = new Thread(() =>
{
this.Invoke((MethodInvoker)delegate {
    picLoad.Visible = true;
    lblProcces.Text = "Saving ...";
});
int intError = setAdd2DBVsosol(vs);
Action action = (() =>
{
    if (intError > 0)
    {
        objVosolError = objVosolError.Where(c => c != null).ToArray();
        DGError.DataSource = objVosolError;// dtErrorDup.DefaultView;
        DGError.Refresh();
        DGError.Show();
        lblMSG.Text = "Check Errors...";
    }
    else
    {
        MessageBox.Show("Saved All Records...");
        blnCanCloseForm = true;
        this.DialogResult = DialogResult.OK;
        this.Close();
    }

});
this.Invoke((MethodInvoker)delegate {
    picLoad.Visible = false;
    lblProcces.Text = "";
});
this.BeginInvoke(action);
});
myThread.Start();
}

void frmExcellImportInfo_FormClosing(object s, FormClosingEventArgs e)
{
    if (!blnCanCloseForm)
        e.Cancel = true;
}
0
Ata Hoseini

Il suffit d'ajouter une ligne dans la fonction événement 

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
             {
                this->DialogResult = System::Windows::Forms::DialogResult::None;
             }
0
Croko

J'aimerais avoir le temps de trouver un meilleur exemple, mais vous feriez bien mieux d'utiliser les techniques de validation des formulaires Windows existantes.

http://msdn.Microsoft.com/en-us/library/ms229603.aspx

0
Mesh