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 :

probleme affichage données de ma base en double


Sujet :

Silverlight

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 207
    Par défaut probleme affichage données de ma base en double
    Bonjour, j'ai un petit problème avec mon code, je débute en silverlight et je ne vois pas vraiment d'ou cela peut venir :
    Lorsque j'ai deux résultats à afficher dans une listBox, il y a 4 résultats qui s'affichent. Les images correspondent bien au pda, cependant le modele ne correspond pas.

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    private void Rechercher_Click(object sender, RoutedEventArgs e)
            {
                    ListBoxPDA.Items.Clear();
                    App.CodeIdent = TextBoxCodeIdent.Text;           
                    ServiceWCF.ServiceWCFClient client = new SilverlightApplication2.ServiceWCF.ServiceWCFClient();
                    client.nb_PDA_UtilisateurCompleted += new EventHandler<SilverlightApplication2.ServiceWCF.nb_PDA_UtilisateurCompletedEventArgs>(client_nb_PDA_UtilisateurCompleted);
                    client.nb_PDA_UtilisateurAsync(TextBoxCodeIdent.Text);
                    client.idIMEI_terminauxCompleted += new EventHandler<ServiceWCF.idIMEI_terminauxCompletedEventArgs>(client_idIMEI_terminauxCompleted);
                    client.idIMEI_terminauxAsync(TextBoxCodeIdent.Text);             
            }
            }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void client_nb_PDA_UtilisateurCompleted(object sender, SilverlightApplication2.ServiceWCF.nb_PDA_UtilisateurCompletedEventArgs e)
            {
                labelnbPDA.Text = e.Result.ToString();
                nbmodele = e.Result;
            }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void client_idIMEI_terminauxCompleted(object sender, SilverlightApplication2.ServiceWCF.idIMEI_terminauxCompletedEventArgs e)
            {
                ServiceWCF.ServiceWCFClient client = new SilverlightApplication2.ServiceWCF.ServiceWCFClient();
     
                string[] modeles = e.Result.ToArray();
     
                for (int i = 0; i < nbmodele; i++)
                {
                    client.infosPdaCompleted += new EventHandler<SilverlightApplication2.ServiceWCF.infosPdaCompletedEventArgs>(client_infosPDACompleted);
                    client.infosPdaAsync(modeles[i]);
                }
            }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void client_infosPDACompleted(object sender, SilverlightApplication2.ServiceWCF.infosPdaCompletedEventArgs e)
            {
                string[] infos = e.Result.ToArray();
                    Modele = infos[0];
                    NumSim = infos[1];
                    idImage = decimal.Parse(infos[2]);
                    StatutPDA = infos[3];
                    IMEI = infos[4];
                    ServiceWCF.ServiceWCFClient client = new SilverlightApplication2.ServiceWCF.ServiceWCFClient();
                    client.GetImageCompleted += new EventHandler<SilverlightApplication2.ServiceWCF.GetImageCompletedEventArgs>(client_GetImageCompleted);
                    client.GetImageAsync(idImage);
            }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void client_GetImageCompleted(object sender, SilverlightApplication2.ServiceWCF.GetImageCompletedEventArgs e)
            {
                Img = e.Result;
                PDA pda = new PDA(Modele, NumSim, Img, StatutPDA, IMEI);
                ListBoxPDA.Items.Add(pda);
            }

  2. #2
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    Salut MaxWel,

    Ce genre de problème est typique d'evenement auquel tu t'abonnes encore et encore sans jamais te désabonner (lors de méthode Completed par exemple).

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 207
    Par défaut
    je dois pas utiliser les Completed ou alors d'une autre maniere?

  4. #4
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    Sisi, utilise les completed mais lorsque tu t'abonnes à un evenement completed (ou autre) en faisant un += il est important de faire un -= dans la methode appelé sinon tu peux te retrouver au pire dans ton cas, au mieux avec des memory leaks.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    client.idIMEI_terminauxCompleted += new EventHandler<ServiceWCF.idIMEI_terminauxCompletedEventArgs>(client_idIMEI_terminauxCompleted);
                    client.idIMEI_terminauxAsync(TextBoxCodeIdent.Text);
    
    void client_idIMEI_terminauxCompleted(object sender, SilverlightApplication2.ServiceWCF.idIMEI_terminauxCompletedEventArgs e)
    {
    client.idIMEI_terminauxCompleted -= new EventHandler<ServiceWCF.idIMEI_terminauxCompletedEventArgs>(client_idIMEI_terminauxCompleted);
    
    }

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 207
    Par défaut
    les -= ça correspond à quoi en fait?
    ça signifie que ma première méthode est terminé?

  6. #6
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    Le += sert à ajouter une methode dans le gestionnaire d'evenement et le -= à la retirer.
    si tu ne fait que du += cela signifie que ta méthode Completed sera appelé autant de fois que tu as fait un +=

    Je te renvoie a ce tuto très bien fait :

    http://freddyboy.developpez.com/dotnet/articles/events/

    le -= est expliqué dans la section IV -> Récupérer un événement dans un gestionnaire d'évenéments.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 207
    Par défaut
    le problème est que j'utilise une boucle j'ai donc besoin de faire appel plusieurs fois a ma méthode (autant de fois que le nombre de modele)

  8. #8
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    Le fait que tu aies une boucle de ne pose pas de problème à partir du moment ou pour chaque += tu as un -=
    Quand tu appuies sur Rechercher_Click tu ajoutes une floppées de méthode dans le gestionnaire avec le += sans jamais les retirées (tu dois retirer dans tous tes completed en faisant un -= comme je t'ai montré dans le dernier code) d'ou ton problème.

    J'espère que je suis plus clair

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 207
    Par défaut
    J'ai toujours ce même problème :
    en fait il n'y a que l'image qui est récupéré correctement
    tout les autres attributs de mes objets de la liste correspondent aux infos du dernier objet ajouté
    je ne sais pas a quel moment je dois placer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PDA pda = new PDA(Modele, NumSim, Img, StatutPDA, IMEI);
    ListBoxPDA.Items.Add(pda);
    Voici mon code en entier :

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    namespace SilverlightApplication2
    {
        
        public partial class MainPage : UserControl
        {
            public byte[] Img;
            public string Modele;
            public decimal idImage;
            public string NumSim;
            public string StatutPDA;
            public string ManuelPDA;
            public string IMEI;
            public List<PDA> pdas;
            bool pdaSelectionne = false;
            public PDA[] pdaUtilisateur;
            int indexPdaSelectione = 0;
            public PDA pda; 
            public BitmapImage ImagePDA;
            public int nbmodele;
            
            public MainPage()
            {
                InitializeComponent();
                Loaded += new RoutedEventHandler(MainPage_Loaded);
            }
    
            void MainPage_Loaded(object sender, RoutedEventArgs e)
            {
                ServiceWCF.ServiceWCFClient client = new SilverlightApplication2.ServiceWCF.ServiceWCFClient();
                client.getNomPrenomUtilisateurCompleted += new EventHandler<SilverlightApplication2.IziServiceWCF.getNomPrenomUtilisateurCompletedEventArgs>(client_getNomPrenomUtilisateurCompleted);
                client.getNomPrenomUtilisateurAsync();
            }
            void client_getNomPrenomUtilisateurCompleted(object sender, SilverlightApplication2.IziServiceWCF.getNomPrenomUtilisateurCompletedEventArgs e)
            {
                this.TextBlockNomUtilisateur.Text = e.Result;
            }
           
            private void Rechercher_Click(object sender, RoutedEventArgs e)
            {
                    ListBoxPDA.Items.Clear();
                    App.CodeIdent = TextBoxCodeIdent.Text;            
                    ServiceWCF.ServiceWCFClient client = new SilverlightApplication2.ServiceWCF.ServiceWCFClient();
                    client.nb_PDA_UtilisateurCompleted += new EventHandler<SilverlightApplication2.ServiceWCF.nb_PDA_UtilisateurCompletedEventArgs>(client_nb_PDA_UtilisateurCompleted);
                    client.nb_PDA_UtilisateurAsync(TextBoxCodeIdent.Text);
                    client.idIMEI_terminauxCompleted += new EventHandler<ServiceWCF.idIMEI_terminauxCompletedEventArgs>(client_idIMEI_terminauxCompleted);
                    client.idIMEI_terminauxAsync(TextBoxCodeIdent.Text);          
            }
    void client_nb_PDA_UtilisateurCompleted(object sender, SilverlightApplication2.ServiceWCF.nb_PDA_UtilisateurCompletedEventArgs e)
            {
                labelnbPDA.Text = e.Result.ToString();
                nbmodele = e.Result;
            }
            }
    void client_idIMEI_terminauxCompleted(object sender, SilverlightApplication2.ServiceWCF.idIMEI_terminauxCompletedEventArgs e)
            {
                ServiceWCF.ServiceWCFClient client = new SilverlightApplication2.ServiceWCF.ServiceWCFClient();
                string[] modeles = e.Result.ToArray();         
                for (int i = 0; i < nbmodele; i++)
                {
                    client.infosPdaCompleted += new EventHandler<SilverlightApplication2.ServiceWCF.infosPdaCompletedEventArgs>(client_infosPDACompleted);
                    client.infosPdaAsync(modeles[i]);
                }         
            }
    
    void client_infosPDACompleted(object sender, SilverlightApplication2.ServiceWCF.infosPdaCompletedEventArgs e)
            {
                ServiceWCF.ServiceWCFClient client = new SilverlightApplication2.ServiceWCF.ServiceWCFClient();
                
                    string[] infos = e.Result.ToArray();
                    Modele = infos[0];
                    NumSim = infos[1];
                    idImage = decimal.Parse(infos[2]);
                    StatutPDA = infos[3];
                    IMEI = infos[4];            
                    client.GetImageCompleted += new EventHandler<SilverlightApplication2.ServiceWCF.GetImageCompletedEventArgs>(client_GetImageCompleted);
                    client.GetImageAsync(idImage);
                    
            }
            void client_GetImageCompleted(object sender, SilverlightApplication2.ServiceWCF.GetImageCompletedEventArgs e)
            {
                Img = e.Result;
                PDA pda = new PDA(Modele, NumSim, Img, StatutPDA, IMEI);  
                ListBoxPDA.Items.Add(pda);
               
            }

  10. #10
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    MaxWel56,

    A part le fait que tu n'es pas mis les retraits du gestionnaire d'evenement (ce qui te posera des problèmes plus tard), tu as effectivement d'autres soucis :

    En effet les variables Modele, NumSim... sont partagés entre tout tes appels infosPdaAsync et donc les données s'ecrasent les unes avec les autres.

    Ce qu'il faut faire :

    lorsque tu appelles client.infosPdaAsync(modeles[i]) passe lui plutot comme paramètre un new PDA() que tu complétera avec les données au fur et à mesure de tes appels (je pense a ton image de fin).
    Lorsque dans le dernier completed (client_GetImageCompleted) tous tes PDA sont prête il n'y a plus qu'a les ajouter.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 207
    Par défaut
    J'ai résolu la moitié de mon problème en passant en parametre un objet PDA.
    Je récupère désormais les bonnes informations.
    Reste à résoudre le problème du nombre d'item dans ma listbox. Il s'agit d'un problème avec mes méthodes asynchrones.
    J'ai une boucle for avec le nombre de modele.
    Lorsque j'en ai trois a afficher chaque item est afficher 3 fois

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    string[] modeles = e.Result.ToArray();         
                for (int i = 0; i < nbmodele; i++)
                {
     
                    PDA pda = new PDA() {Modele = modeles[i]};
                    client.infosPdaCompleted += new EventHandler<SilverlightApplication2.ServiceWCF.infosPdaCompletedEventArgs>(client_infosPDACompleted);
                    client.infosPdaAsync(modeles[i],pda);
                }



    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
     
                void client_infosPDACompleted(object sender, SilverlightApplication2.ServiceWCF.infosPdaCompletedEventArgs e)
            {
                ServiceWCF.ServiceWCFClient client = new SilverlightApplication2.ServiceWCF.ServiceWCFClient();
                client.infosPdaCompleted -= new EventHandler<SilverlightApplication2.ServiceWCF.infosPdaCompletedEventArgs>(client_infosPDACompleted);
                PDA pda = e.UserState as PDA;   
                    string[] infos = e.Result.ToArray();
                    pda.Modele = infos[0];
                    pda.NumeroSim = infos[1];
                    idImage = decimal.Parse(infos[2]);
                    pda.StatutPda = infos[3];
                    pda.IMEI = infos[4];
     
                    client.GetImageCompleted += new EventHandler<SilverlightApplication2.ServiceWCF.GetImageCompletedEventArgs>(client_GetImageCompleted);
                    client.GetImageAsync(idImage,pda);
     
            }

  12. #12
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    Enleve le += de ta boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    client.infosPdaCompleted += new EventHandler<SilverlightApplication2.ServiceWCF.infosPdaCompletedEventArgs>(client_infosPDACompleted);
     
    for (int i = 0; i < nbmodele; i++)
                {
     
                    PDA pda = new PDA() {Modele = modeles[i]};
                    client.infosPdaAsync(modeles[i],pda);
                }
    Enlève aussi le -= correspondant dans ton Completed.

    Tu n'auras plus le problème de duplication même si le fait de ne pas avoir de -= c'est un peu bof.

    Le plus simple et le plus performant aurait été de faire une méthode WCF du genre PDA[] GetAllPDA() qui te renverraient tous les PDA directement.

Discussions similaires

  1. [MySQL] Probleme affichage données sql en double
    Par stefanelle dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 24/04/2009, 12h41
  2. probleme affichage données datagrid
    Par noname_971 dans le forum Windows Forms
    Réponses: 0
    Dernier message: 02/04/2009, 17h09
  3. Probleme affichage données dans un tableau
    Par spider_sup dans le forum NetBeans
    Réponses: 0
    Dernier message: 15/08/2008, 11h10
  4. Réponses: 8
    Dernier message: 03/04/2006, 19h28

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