64 votes

Empêcher la fermeture d'une boîte de dialogue dans le gestionnaire d'événement de clic du bouton

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

Je veux effectuer une validation des entrées dans le gestionnaire d'événements et, en cas d'échec, avertir l'utilisateur par une boîte de message et empêcher la fermeture de la boîte de dialogue. Je ne sais pas comment réaliser la dernière partie (empêcher la fermeture).

140voto

Arjan Points 877

Vous pouvez annuler la fermeture en paramétrant l'option DialogResult a DialogResult.None .

Un exemple où le bouton1 est le bouton d'acceptation :

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

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

45voto

ChrisF Points 74295

Étant donné que vous avez spécifié que vous vouliez une boîte de dialogue d'erreur pop Une façon de procéder est de déplacer votre validation dans un fichier de type OnClosing gestionnaire d'événements. Dans cet exemple, la fermeture du formulaire est interrompue si l'utilisateur répond oui à la question posée 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 fixant e.Cancel = true vous empêcherez la fermeture du formulaire.

Cependant, l'affichage des erreurs de validation en ligne serait une meilleure conception/expérience utilisateur. (en mettant en évidence les champs en question d'une manière ou d'une autre, en affichant des infobulles, etc.) et empêcher l'utilisateur de sélectionner le bouton OK en premier lieu.

16voto

Hans Passant Points 475940

N'utilisez pas l'événement FormClosing pour cela, car vous devez permettre à l'utilisateur de quitter la boîte de dialogue en cliquant sur Annuler ou sur le X. Mettez simplement en œuvre le gestionnaire d'événements Click du bouton OK et ne fermez pas avant d'être satisfait :

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

Où "ValidateControls" est votre logique de validation. Renvoyer false si quelque chose ne va pas.

3voto

Benjol Points 16334

Cela ne répond pas directement à votre question (d'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é tant que l'entrée n'est pas valide.

3voto

cigos emmanuel Points 21

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 ;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X