Surcharge class form pour palier au problème de la validation systématique des contrôles lors du close d'une form

Soyez le premier à donner votre avis sur cette source.

Snippet vu 8 453 fois - Téléchargée 18 fois

Contenu du snippet

Je voulais pouvoir utiliser la possibilité que mes contrôles déclenchent leur validation à chaque fois qu'ils perdent le focus mais aussi ne pas déclencher cette validation lorsque l'utilisateur souhaite quitter la fenêtre (croix, Alt+F4, CancelButton, Escape). Le problème c'est que si la propriété AutoValidate d'une fenêtre est «EnablePreventFocusChange» alors la validation s'exécute dès que le close de la fenêtre est appelé.

Mettre le CauseValidation du CancelButton à false ne suffit pas. En plus la croix et le Alt+F4 ne serait pas impactés.

J'ai donc fait cette petite surcharge de la class Form pour résoudre ce problème. Quand vous créez une fenêtre, il suffit de la faire hériter de MaForm au lieu de Form.

Source / Exemple :


using System;
using System.Windows.Forms;
using System.Security.Permissions;

namespace MonNameSpace
{
    /// <summary>
    /// Représente une version surchargée de la class Form
    /// </summary>
    public class MaForm : Form
    {
        private const int WM_CLOSE = 0x10;

        [UIPermission(SecurityAction.LinkDemand, Window=UIPermissionWindow.AllWindows)]
        protected override bool ProcessDialogKey(Keys keyData)
        {
            if (keyData == Keys.Escape && CancelButton != null)
            {
                AutoValidate = AutoValidate.Disable;
            }
            return base.ProcessDialogKey(keyData);
        }

        [SecurityPermission(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.UnmanagedCode)]
        protected override void WndProc(ref Message m)
        {
            switch (m.Msg)
            {
                case WM_CLOSE:
                    AutoValidate = AutoValidate.Disable;
                    break;
                default:
                    break;
            }
            base.WndProc(ref m);
        }
    }
}

Conclusion :


La surcharge de WndProc ne suffit pas à elle toute seule car le Escape déclenche le message «WM_CLOSE» que si le contrôle en cours est validé.

Ce n'est pas une méthode très très élégante mais je n'ai jamais trouvé aucune autre solution qui gère tout les cas énoncés plus haut.

Sous VB6 les fenêtres n'avaient pas ce problème. Il y avait juste un petit problème de validation qui ne se déclenchait pas pour le contrôle ayant le focus lorsque l'on faisait «Entrée» au clavier.

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.