Comment sauter la validation après avoir cliqué sur le bouton D'Annulation D'un formulaire

j'utilise C#. J'ai un formulaire Windows avec une boîte d'édition et un bouton D'Annulation. La boîte d'édition a le code dans l'événement de validation. Le code est exécuté chaque fois que la boîte d'édition perd la mise au point. Quand je clique sur le bouton Annuler, je veux juste fermer le formulaire. Je ne veux pas qu'une validation de la zone d'édition soit exécutée. Comment cela peut-il être réalisé?

voici un détail important: si la validation échoue ,alors

            e.Cancel = true;

empêche de quitter le contrôle.

mais quand un utilisateur clique sur le bouton Annuler, alors le formulaire doit être fermé quoi qu'il arrive. comment cela peut-il être mis en œuvre?

39
demandé sur user228985 2009-12-10 20:16:15

15 réponses

si la validation se produit lorsque la boîte d'édition perd la mise au point, rien sur le bouton Annuler ne va empêcher que cela se produise.

cependant, si l'échec de la validation empêche le bouton cancel de faire son truc, mettez la propriété CausesValidation du bouton à false .

référence: Button.CausesValidation biens

42
répondu Daniel Schaffer 2009-12-10 17:32:02

évidemment CausesValidation propriété du bouton doit être mis à false et puis l'événement de validation ne se produira jamais sur son clic. Mais cela peut échouer si le contrôle parent du bouton a sa propriété CausesValidation définie à true. La plupart du temps, les développeurs oublient/oublient de changer la propriété CausesValidation du container control (comme le panneau control). Mettez ça aussi à False. Et cela devrait faire l'affaire.

29
répondu Vimal Raj 2010-10-11 04:46:46

j'avais de la difficulté à fermer mon formulaire, car la validation de certains contrôles l'arrêtait. J'avais mis le control.CausesValidation = false pour le bouton annuler et de tous les parents du bouton annuler. Mais encore, c'était d'avoir des problèmes.

il semblait que si l'utilisateur était au milieu de l'édition d'un champ qui utilisait la validation et avait juste décidé d'abandonner (laissant le champ avec une entrée invalide), l'Événement du bouton d'annulation était déclenché mais la fenêtre ne serait pas fermer.

ceci a été corrigé par ce qui suit dans l'événement de clic de bouton d'annulation:

private void btnCancel_Click(object sender, EventArgs e)
{
    // Stop the validation of any controls so the form can close.
    AutoValidate = AutoValidate.Disable;
    Close();
}
20
répondu Ben 2013-10-16 14:13:18

définit la propriété CausesValidation du bouton Cancel à false .

18
répondu womp 2009-12-10 17:17:16

définit la propriété CausesValidation à false .

4
répondu Brandon 2009-12-10 17:17:50

Aucune de ces réponses assez fait le travail, mais la dernière réponse de ce fil ne. Fondamentalement, vous devez:

  1. assurez-vous que le bouton D'Annulation (le cas échéant) a .La validation de cause à effet fixée à false
  2. outrepasse cette méthode virtuelle.

    protected override bool ProcessDialogKey(Keys keyData) {
        if (keyData == Keys.Escape) {
            this.AutoValidate = AutoValidate.Disable;
            CancelButton.PerformClick();
            this.AutoValidate = AutoValidate.Inherit;
            return true;
        }
        return base.ProcessDialogKey(keyData);
    }
    

Je n'ai pas vraiment répondu à cela, juste pointant du doigt les deux gars qui ont réellement fait.

4
répondu Wade Hatler 2017-05-23 12:09:54

une utilisation judicieuse de la propriété Control.CausesValidation vous aidera à obtenir ce que vous voulez.

2
répondu Joe 2009-12-10 17:18:00

fixer la validation causale à false est la clé, mais cela ne suffit pas. Si les boutons parent ont une CausesValidation définie à true, l'événement de validation sera quand même appelé. Dans un de mes cas, j'ai eu un bouton annuler sur un panneau dans un formulaire, j'ai donc dû définir CausesValidation = false sur le panneau ainsi que la forme. En fin de Compte, j'ai fait cela de façon programmatique, car c'était plus simple que de passer en revue tous les formulaires...

Control control = cancelButton;

while(control != null)
{
   control.CausesValidation = false;
   control = control.Parent;
}
2
répondu Steve Sheldon 2010-04-13 15:58:40

en complément de la réponse de Daniel Schaffer: si la validation se produit lorsque la boîte d'édition perd la mise au point, vous pouvez interdire le bouton d'activer pour contourner la validation locale et sortir de toute façon.

public class UnselectableButton : Button
{
    public UnselectableButton()
    {
        this.SetStyle(ControlStyles.Selectable, false);
    }
}

ou si vous utilisez DevExpress:

this.simpleButtonCancel.AllowFocus = false;

notez que cela changera l'expérience du clavier: l'onglet se concentrera plus sur le bouton Annuler.

0
répondu Olivier de Rivoyre 2013-01-24 04:03:43

peut-être que vous voulez utiliser BackgroundWorker pour donner un peu de retard, de sorte que vous pouvez décider si la validation doit s'exécuter ou non. Voici l'exemple d'éviter la validation sur la fermeture du formulaire.

    // The flag
    private bool _isClosing = false;

    // Action that avoids validation
    protected override void OnClosing(CancelEventArgs e) {
        _isClosing = true;
        base.OnClosing(e);
    }

    // Validated event handler
    private void txtControlToValidate_Validated(object sender, EventArgs e) {           
        _isClosing = false;
        var worker = new BackgroundWorker();
        worker.DoWork += worker_DoWork;
        worker.RunWorkerAsync();
        worker.RunWorkerCompleted += worker_RunWorkerCompleted;
    }

    // Do validation on complete so you'll remain on same thread
    void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
        if (!_isClosing)
            DoValidationHere();
    }

    // Give a delay, I'm not sure this is necessary cause I tried to remove the Thread.Sleep and it was still working fine. 
    void worker_DoWork(object sender, DoWorkEventArgs e) {
        Thread.Sleep(100);
    }
0
répondu Adiono 2014-08-25 04:24:00

juste au-dessus du code de validation sur la boîte d'Édition Ajouter:

if (btnCancel.focused)
  {
     return;
  }

ça devrait le faire.

0
répondu TonyM 2016-01-28 12:31:43

dans mon cas, sous la forme je fixe la propriété AutoValidate à Enablowfocuschange

0
répondu Alecs 2017-02-02 10:47:30

en utilisant Visual Studio wizard vous pouvez le faire comme cela:

enter image description here

0
répondu Oscar Castiblanco 2018-07-03 16:42:46

C'est une vieille question cependant, j'ai récemment rencontré ce problème et résolu de cette façon:

1er, nous chargeons un UserControl dans un "shell" formulaire qui a un bouton Enregistrer et annuler. Le UserControl hériter d'une interface (comme IEditView ) qui a des fonctions pour Enregistrer , Annuler , Valider et Togglévalidate .

dans la forme shell nous avons utilisé la souris entrer et la souris sortir comme ceci:

    private void utbCancel_MouseEnter(object sender, EventArgs e)
    {
        ((Interface.IEdit)tlpMain.Controls[1]).ToggleValidate();
    }

    private void utbCancel_MouseLeave(object sender, EventArgs e)
    {
        ((Interface.IEdit)tlpMain.Controls[1]).ToggleValidate();
    }

puis dans ToggleValidate (dire une forme simple avec deux contrôles...vous pouvez toujours simplement boucler une liste si vous voulez) nous définissons la CausesValidation

    public bool ToggleValidate()
    {
        uneCalcValue.CausesValidation = !uneCalcValue.CausesValidation;
        txtDescription.CausesValidation = !txtDescription.CausesValidation;

        return txtDescription.CausesValidation;
    }

Espérons que cette aide.

0
répondu melegant 2018-07-10 17:22:05

Ce travail pour moi.

private void btnCancelar_MouseMove(object sender, MouseEventArgs e)
{
    foreach (Control item in Form.ActiveForm.Controls)
    {
        item.CausesValidation = false;
    }
}
-1
répondu user4938759 2015-05-26 08:29:30