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

Silverlight Discussion :

Datagrid : contrôle de saisie et validation


Sujet :

Silverlight

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 44
    Par défaut Datagrid : contrôle de saisie et validation
    Bonjour,

    Je travaille avec Visual Studio 2008 et Silverlight 3.
    Je souhaiterais mettre en place un contrôle de saisie sur le contenu des cellules d'un datagrid.
    En cherchant sur le net je suis tombé sur une méthode assez utile et efficace avec l'utilisation des DataAnnotations ([Required], [DataType] etc.) comme le montre le lien suivant : http://blogs.msdn.com/nagasatish/arc...alidation.aspx

    J'ai donc ajouté ces DataAnnotations aux setters des propriétés de ma classe principale, un exemple ci-dessous :
    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
     
            [Required(ErrorMessage = "Le numéro de compte saisi n'est pas valide. Saisissez un numéro de compte.")]
            [StringLength(12, ErrorMessage = "Le numéro de compte ne peut excéder 12 caractères. Vérifiez votre saisie.")]
            [RegularExpression("^[1-8][a-zA-Z0-9]*$",
                ErrorMessage = "Seuls les numéros de compte de racine 1 à 8 sont acceptables. Vérifiez votre saisie.")]
            [DataType(DataType.Text)]
            public string CodeCompte 
            { 
                get {   return c_cog_code;  } 
                set
                {
                    if (value != c_cog_code)
                    {
                        c_cog_code = value;
                        NotifyPropertyChanged("CodeCompte");
                    }
                } 
            }
    Seulement, j'aurais besoin de faire un dernier contrôle : vérifier que ma valeur n'existe pas déjà en bdd, c'est-à-dire : chercher la valeur saisie dans la bdd pour déterminer son existence et retourner un message d'erreur si la valeur existe déjà.

    Et je ne sais pas où implémenter ce contrôle pour garder une cohérence graphique avec les DataAnnotations.
    Que me conseillez-vous ?

    Cordialement,

  2. #2
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Plus loin dans ton article tu as ton attribut CustomValidation qui te permet de faire une validation custom.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 44
    Par défaut
    Bonjour PitMaverick78,

    Merci de ta réponse.
    Effectivement j'avais remarqué, je suis en train de tester le fonctionnement de cette CustomValidation.

    Je vous demandais conseil parce que je me disais qu'interroger la base à cet "endroit" dans le code n'était peut être pas très "propre" et qu'il existait peut-être une autre façon de procéder.

    La CustomValidation serait donc la seule solution ?

  4. #4
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Il me semble qu'il existe une méthodologie qui lorsque l'entité est envoyé au serveur, permet de faire des contrôles et de lever une erreur particulière mais je ne m'y connais pas trop là dessus.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 44
    Par défaut
    Ah? Quelqu'un aurait-il plus de précisions ?
    J'ai testé un peu le CustomValidation mais je me heurte à un problème de taille : comme nous le savons tous, en Silverlight, les interactions avec le service web se font en mode asynchrone, du coup impossible de récupérer et de tester tout de suite les résultats retournés par le service web.

    Ci-dessous mon code pour mieux comprendre :

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     public static class CCompteValidator
        {
            private static  Nullable<bool> is_existe;
            private static BDServiceClient mBDService = new BDServiceClient();
            private static ValidationResult mValidationResult;
     
            public static ValidationResult IsExisteCodeCompte(object pCompte)
             {
                ValidationResult validationResult = null; 
     
                CCompte lCompte = pCompte as CCompte;
                string lCodeCompte = lCompte.CodeCompte;
     
                Verifier_Existence_Compte(lCompte.ID_CODE, lCodeCompte);
     
                return validationResult;
            }
     
            public static void Verifier_Existence_Compte(string pIdCode, string pNumCompte)
            {
                mBDService.Verifier_Existence_Compte_PcgCompleted += new EventHandler<Verifier_Existence_Compte_PcgCompletedEventArgs>(mBDService_Verifier_Existence_Compte_PcgCompleted);
     
                mBDService.Verifier_Existence_Compte_PcgAsync(pIdCode, pNumCompte);
            }
     
            private static void mBDService_Verifier_Existence_Compte_PcgCompleted(object sender, Verifier_Existence_Compte_PcgCompletedEventArgs e)
            {
                    string lMessage = string.Empty;
     
                    is_existe = e.Result;
     
                    if (is_existe != null)
                    {
                        if (is_existe == true)
                        {
                            mValidationResult = new ValidationResult("Ce numéro éxiste déjà");
                        }
                    }
                    else
                        mValidationResult = ValidationResult.Success;
            }
        }
    En mode debogage, j'ai pu constater que l'EventHandler Completed du service web n'est levé qu'à la sortie de "IsExisteCodeCompte".
    Connaissez-vous une solution à ce problème ?

  6. #6
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Tu peux utiliser une synchro inter-threads.
    Dans la méthode appellant le service async, tu crées un autoresetevent, tu lances ta fonction asynchrone et apres tu attends attends ton autoresetevent.
    Du côté de ta fonction asynchrone, il faut qu'elle leve cet autoresetevent.
    De mémoire:
    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
     
    public class MaClasse
    {
      private AutoResetEvent _myEvent = new AutoResetEvent(false);
      private object _myResult;
     
      public void MaFonction()
      {
        TrucLong.Completed += (sender,args)=>{ _myResult = args.Result; _myEvent.Set();  }
        TrucLong.RunAsync();
        _myEvent.WaitOne();
        //Ici ton resultat de fonction est dans _myResult
      }
     
    }

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 44
    Par défaut
    Cette solution a l'air très intéressante, un souci toutefois : WaitOne() bloque complètement le déroulement du Thread.
    Ah je ne suis pas loin de la solution, il doit manquer un truc tout bête...
    Si vous avez une idée je prends ! ^^

  8. #8
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Et pourquoi tu ne fais pas la validation côté client ?

    Tu récupères tous les CodeComptes de ta BD et tu vérifies en local si il n'existe pas déjà.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 44
    Par défaut
    Effectivement je crois que c'est la meilleure solution. Après plusieurs recherches et essais, je ne parviens pas à un résultat concluant avec la synchronisation inter-threads.
    Je vais faire comme tu le suggères Skyounet.
    Merci de votre aide.

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

Discussions similaires

  1. Contrôle de saisie dans un DataGrid
    Par CryoCid dans le forum VB.NET
    Réponses: 6
    Dernier message: 21/06/2010, 13h35
  2. Datagrid editable : contrôle de saisie
    Par tafkap dans le forum Flex
    Réponses: 1
    Dernier message: 19/11/2009, 12h05
  3. contrôle de saisie menu déroulant
    Par shnouf dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 05/01/2006, 16h30
  4. contrôle de saisie
    Par oceane751 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 05/01/2006, 11h24
  5. [debutant] contrôle de saisie et formulaire
    Par oceane751 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 27/11/2005, 22h29

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