IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

Empêcher la fermeture d'une fenêtre modale


Sujet :

Windows Forms

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    Mars 2009
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 83
    Points : 89
    Points
    89
    Par défaut Empêcher la fermeture d'une fenêtre modale
    Bonsoir

    Je travaille sur un formulaire de login pour mon application et j'ai un petit soucis.
    Lorsque mon application se lance, le formulaire de login est appelé automatiquement. Je voudrais pouvoir vérifier que les login et mot de passe entrés sont correct lors du clic sur le bouton Valider.

    Sur l'évènement onClick(), si l'un des deux champs est vide alors j'affiche un message d'erreur avec MessageBox.Show().Sinon, je ferme le formulaire et je traite les informations récupérées dans ma fenêtre principale.

    Le problème c'est que même si l'un des champs est vide, la fenêtre se ferme quand même :/. Je précise que j'ai attribué la propriété DialogResult OK à mon bouton Valider.

    Voici le code du formulaire principal :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     private void MainForm_Load(object sender, EventArgs e)
            {
                LoginForm loginForm = new LoginForm();
                loginForm.ShowDialog();
     
                if (loginForm.DialogResult == DialogResult.OK)
                {
                    currentUser.ID_utilisateur = Int32.Parse(loginForm.Login);
                    currentUser.password = loginForm.Password;
                }
                else if (loginForm.DialogResult == DialogResult.Abort)
                {
                    wantToQuit = true;
                }
            }
    Et voici le code de mon formulaire de login :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    private void submitButton_Click(object sender, EventArgs e)
            {
                _login = loginBox.Text;    
                _password = pwdBox.Text;
     
                if (_login.Equals("") || _password.Equals(""))
                {
                    MessageBox.Show("Please make sure you entered a login and a password.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                else
                {
                    TimeTableDbDataContext dbContext = new TimeTableDbDataContext();
     
                    _user = new UTILISATEUR();
                    _user.ID_utilisateur = Int32.Parse(_login);
                    _user.password = _password;
     
                    if (dbContext.UTILISATEUR.Contains(_user))
                    {
                        this.Close();
                    } 
                    else {
                        MessageBox.Show("Your login and/or your password are incorrect !", "Log in", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
            }
    Merci pour votre aide

  2. #2
    Membre régulier

    Profil pro
    Inscrit en
    Mars 2009
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 83
    Points : 89
    Points
    89
    Par défaut
    Je vais reformuler un peu si ça peut aider

    Je voudrais pouvoir contrôler les données saisies dans un formulaire au moment ou l'utilisateur clique sur le bouton de validation mais si les données ne sont pas correctes, annuler la validation (et donc la fermeture du formulaire).

    Et si ce n'est pas possible, quelle autre solution existe pour arriver au même résultat ? Le but étant d'empêcher l'accès à mon application tant que l'utilisateur n'est pas authentifié.

    Merci

  3. #3
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Abonnes toi à l'événement FormClosing de ton formulaire et annule la fermeture avec
    si les conditions de sortie ne sont pas valides. Pour que cela fonctionne il faut par contre affecter un DialogResult aux boutons du formulaires (ça peut se faire en Design, il y a une propriété sur les boutons pour ça).

    Sinon lorsqu'un formulaire est affiché en modal, lorsque celui se ferme il est juste masqué. Il faut donc penser à bien nettoyer les ressources lorsque l'on affiche un formulaire en modal.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    using (LoginForm loginForm = new LoginForm())
    {
        loginForm.ShowDialog();
        ...
    }

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Je suppose que l'authentification est bonne si "Le login ET les psw" sont corrects. Je n'ai pas vu ce test dans le code.
    Soit vous bouclez tant que cette condition n'est pas remplie, mais il faut prévoir un bouton annuler (c'est la solution que j'ai adoptée), soit vous autorisez un nombre maximum d'essais.
    Dans mon applicatif, j'ai aussi la lecture d'un fichier INI, s'il existe, en ce cas, les login et psw sont renseignés et il suffit de faire OK.

    Par ailleurs, j'ai un peu de mal à comprendre votre code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                    _user = new UTILISATEUR();
                    _user.ID_utilisateur = Int32.Parse(_login);
                    _user.password = _password;
     
                    if (dbContext.UTILISATEUR.Contains(_user))
    Si _user est un objet, on devrait peut-être plutôt avoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                   if (_user.Cantains(...))
                   {
                       // test psw
                   }
    Mais je crois surtout que le test de validité est fait APRES être sorti de la fenêtre, ou n'est pas fait du tout ?

  5. #5
    Membre régulier

    Profil pro
    Inscrit en
    Mars 2009
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 83
    Points : 89
    Points
    89
    Par défaut
    Je vais tester l'évènement FormClosing()

    Pour ce qui est du test de mon code, actuellement, je récupère les champs login et mot de passe des textbox et je set les propriétés de mon objet _user qui est un objet de la classe UTILISATEUR, tirée de ma base de données via une classe LINQ TO SQL.

    Ensuite, je vérifie si ce _user existe dans ma base de données avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dbContext.UTILISATEUR.contains(_user)
    Mais ça ne fonctionne pas bien. Si le login est bon, ça passe, même si le password ne correspond pas au login.

    J'essaierai en passant par une requête linq to sql complète Je vous tiens au courant quand j'aurai essayé tout ça.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Dans le domaine du Web, et avec PHP on ne peut vérifier l'identification qu'au retour de la fonction de formulaire.
    Il n'en est pas de même dans votre contexte, puisque vous êtres dans une fenêtre modale, il est préférable de n'en sortir que quand son boulot est terminé, c'est à dire par vrai ou faux.
    UTILISATEUR est le nom d'une classe ou le nom d'un objet de type UTILISATEUR?
    Dans le premier cas, je ne pense pas que la syntaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dbContext.UTILISATEUR.contains(_user)
    est correcte.
    Dernière modification par Deepin ; 31/05/2010 à 09h58. Motif: Balises [CODE]...[/CODE]

  7. #7
    Membre régulier

    Profil pro
    Inscrit en
    Mars 2009
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 83
    Points : 89
    Points
    89
    Par défaut
    Au départ, UTILISATEUR, c'est une table de ma base de données. Mais grâce à Linq To SQL, je peux l'utiliser comme une classe mappée à ma base de données.

    Et effectivement, le dbContext.UTILISATEUR.contains() ne fonctionne pas bien. J'ai du écrire une méthode qui vérifie le login ET le mot de passe dans ma base de données

  8. #8
    Membre régulier

    Profil pro
    Inscrit en
    Mars 2009
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 83
    Points : 89
    Points
    89
    Par défaut
    J'ai fini par obtenir le comportement désiré en tenant compte de vos conseils
    Au départ, j'avais utilisé l'évènement formClosing() qui fonctionnait bien mais qui du coup m'empêchait de fermer le formulaire en cliquant sur la croix ou sur un bouton Cancel à cause de la validation d'un textbox que j'avais placée dans ce formClosing().

    Du coup, j'ai réutilisé l'évènement onclick de mon bouton Valider sauf que j'ai défini sa propriété DialogResult à none par défaut. Du coup lorsque je clique dessus, je peux décider quand la passer à OK et quand fermer la fenêtre

    Ça fonctionne bien.

    Par contre, j'ai une petite question par rapport à ce que StormimOn a dit à propos de nettoyer les sources en utilisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    using (LoginForm loginForm = new LoginForm())
    {
        loginForm.ShowDialog();
        ...
    }
    au lieu de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    LoginForm loginForm = new LoginForm();
    loginForm.ShowDialog();
    Quelqu'un pourrait m'expliquer la différence ?

    Merci

  9. #9
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    J'ai expliqué pourquoi il me semble ^^

    Si on prend la MSDN pour la méthode ShowDialog on trouve ceci
    Citation Envoyé par MSDN
    Dans la mesure où un formulaire affiché comme une boîte de dialogue n'est pas fermé, vous devez appeler sa méthode Dispose lorsqu'il n'est plus nécessaire à l'application.
    Et pour ce faire, soit on appelle la méthode Dispose explicitement soit un utilise l'instruction using

  10. #10
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Normalement, et j'aurais tendance à dire toujours, un "new" doit être suivi d'un "delete"
    New crée une certaine chose, un objet, tant que cette chose n'a pas été détruite, même si on ne la voit plus, elle existe toujours.
    Elle peut être détruite explicitement (delete) ou implicitement par d'autres méthodes.
    Si on ne le fait pas on risque de remplir la mémoire de l'ordinateur jusque ce que ça déborde .

  11. #11
    Membre régulier

    Profil pro
    Inscrit en
    Mars 2009
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 83
    Points : 89
    Points
    89
    Par défaut
    Ok, merci pour toutes ces précisions

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. empêcher la fermeture d'une fenêtre
    Par Nouk_Lea dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 03/04/2009, 07h43
  2. empêcher la fermeture d'une fenêtre par Alt+F4
    Par doderic dans le forum GTK+ avec C & C++
    Réponses: 3
    Dernier message: 25/08/2008, 17h11
  3. Fermeture d'une fenêtre modale
    Par od.dev dans le forum Composants VCL
    Réponses: 8
    Dernier message: 04/10/2007, 09h07
  4. Réponses: 5
    Dernier message: 15/01/2007, 10h45
  5. ouverture/fermeture d'une fenêtre modale showModelessDialog
    Par marti dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 04/01/2006, 05h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo