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

C# Discussion :

Ralentissement dans le remplissage d'une combo par datatable


Sujet :

C#

  1. #1
    Membre confirmé
    Inscrit en
    Août 2009
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 149
    Par défaut Ralentissement dans le remplissage d'une combo par datatable
    Salut à tous,
    J'ai un soucis avec une combo dans une application. En effet, j'ai une combo que je remplis avec une datatable à chaque fois que l'utilisateur clik dans une zone de texte. Le problème est qu'au premier chargement, la combo se remplie en moins d'une second mais au après le premier remplissage c'est le calvaire le remplissage de la combo peut mettre jusqu'a 22 secondes en moyenne avant d'afficher les données ce qui fait perdre au moins une minute à un utilisateur en trois clicks. Que faire ??
    Merci!

  2. #2
    Membre chevronné Avatar de Jerede
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2010
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mai 2010
    Messages : 271
    Par défaut
    Montre ton code pour commencer , c'pas vraiment normal que ça mette plus de temps pas la suite

  3. #3
    Membre très actif Avatar de oussi
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Maroc

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

    Informations forums :
    Inscription : Octobre 2009
    Messages : 192
    Par défaut
    c'pas vraiment normal que ça mette plus de temps pas la suite
    Effectivement. Normalement sa doit être le contraire.

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    +1

    m'enfin il nous en effet du code, ou au moins le nombre de colonnes/lignes du datatable et la manière de transférer du datatable au combobox
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre confirmé
    Inscrit en
    Août 2009
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 149
    Par défaut
    C'est vrai vous avez raison j'ai oublié de mettre mon code. Le voici:
    Sur un clik dans la zone de texte "txt_Libelle" je rends visible un groupbox dans lequel se trouve ma combo avec la propriétés DropDownStyle à simple.

    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 txt_Libelle_Click(object sender, EventArgs e)
            {
                try
                {
                    this.grp4.Visible = true;
                    this.cmb_fournitures.Focus();
                    tm.remplirCombo(this.cmb_fournitures, "PS_SEL_ListFourniture");
                }
                catch(Exception Ex)
                {
                    tm.messageErreur(Ex.Message.ToString());
                }
     
            }
    la methode "remplirCombo" se trouve dans une classe appelée toutesMethodes que j'instancie comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     toutMethodes tm = New toutesMethodes();
    ensuite je lui passe le nom de la combo et la procédure stockée qui permet la sélection. Une procédure stockée avec une requête de sélection simple.

    voici le code de la méthode :

    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
     
     
    public void remplirCombo(ComboBox Cmb, string Procedure) 
            { 
                try
                {
                    Cnx.SqlCnx.Open(); //Une classe qui contient les informations de connexion à ma base sql server
                    Cmd.Connection = Cnx.SqlCnx;
                    Cmd.Parameters.Clear();
     
                    Cmd.CommandType = CommandType.StoredProcedure;
                    Cmd.CommandText = Procedure;
                    Dtable.Columns.Clear();
                    Dtable.Clear(); //DataTable
                    SqlDataReader SqlDr = Cmd.ExecuteReader();
     
                    Dtable.Columns.Add("C1", typeof(decimal));
                    Dtable.Columns.Add("C2", typeof(string));
                    Dtable.Rows.Add(0, "");
     
                    while (SqlDr.Read())
                    {
                        Dtable.Rows.Add(SqlDr.GetDecimal(0), SqlDr.GetString(1));
                    } SqlDr.Close();
                    Cmb.DataSource = Dtable;
                    Cmb.DisplayMember = "C2";
                    Cmb.ValueMember = "C1";
                }
                catch (Exception Ex)
                {
                    MessageBox.Show(Ex.Message.ToString(), Version(), MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                finally
                {
                    Cnx.SqlCnx.Close();
                }
            }
    Voila! c'est le code qui s'exécute à chaque click dans la zone de texte.

  6. #6
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    c'est vrai que c'est pas du code très optimisé déjà
    il vaudrait mieux charger toutes les données possibles au début, et sur le click travailler sur des collections (ou un datatable si tu préfères) pour remplir le combobox sur l'event click

    mais il faudrait aussi voir le code de la procédure stockée, car exécuter une requete qui remonte quelques lignes c'est pas censé être long
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Par défaut
    Bonjour,

    As-tu "épuré" le code car (et je rejoins Pol63) dans ce que tu as fourni, il n'y a aucun paramètre à ta procédure stockée, donc elle te retourne toujours la même chose donc pourquoi le refaire plusieurs fois ?

  8. #8
    Membre confirmé
    Inscrit en
    Août 2009
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 149
    Par défaut
    Salut,
    ostenhard, effectivement il n'y a aucun paramètre, la liste est susceptible de changer entre deux chargements. Je prends le cas où un utilisateur charge la liste des fournitures et s'aperçoit qu'une fourniture n'y figure pas. Il vas dans ce cas dans les paramètres pour ajouter l'élément qui manque. Mais quand il va revenir cliquer dans la zone de texte il faut qu'il retrouve l'élément ajouté plutôt c'est donc pour ca.

  9. #9
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Par défaut
    Ok donc je rejoins à 100% Pol63, tu ne charges d'une seule fois, stocke le résultat en "session" et travaille dessus si nécessaire.

    Par contre je ne connais pas le contexte de ton application mais si un autre utilisateur modifie les données tu n'auras pas nécessairement la dernière version de celles-ci.

  10. #10
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    si tu es sur une application multi utilisateur, rafraichir à chaque fois peut etre utile, m'enfin dans ce cas il faut analyser ta procédure stockée et ton modèle de base, car 22 secondes c'est le temps qu'il faut pour avoir 100 000 lignes et 30 colonnes ^^

    si tu es sur du mono utilisateur tu peux quand meme charger les données une fois au début, si l'utilisateur ajoute un element, tu le rajoute dans le datatable en meme temps que dans la base ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  11. #11
    Membre confirmé
    Inscrit en
    Août 2009
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 149
    Par défaut
    Salut,
    en suivant vos conseils j'ai refais la méthode de chargement en mettant une condition pour que le chargement ne se fasse que quand il y a ajout et tout marche bien le temps d'affichage qui était dans l'ordre de 22s est passé à moins d'une seconde. C'est lorsqu'il y a ajout que le temps de chargement devient long. C'est peut être pas la meilleure solution mais pour l'instant cela fais gagner du temps aux utilisateurs.
    Merci et a bientôt !!

  12. #12
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    tu peux utiliser le multithreading pour ne pas figer l'interface
    m'enfin le temps d'accès à ta base de données dénote un problème de conception
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

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

Discussions similaires

  1. [WD17] Sélection Multiple dans une COMBO par programmation
    Par droliprane dans le forum WinDev
    Réponses: 5
    Dernier message: 25/04/2014, 15h19
  2. Réponses: 2
    Dernier message: 18/10/2011, 14h57
  3. [WD10-Exp]Remplir une combo par programmation
    Par evosan dans le forum WinDev
    Réponses: 5
    Dernier message: 19/04/2007, 10h22
  4. remplissage d'une combo
    Par dan65 dans le forum WinDev
    Réponses: 4
    Dernier message: 13/04/2007, 13h40
  5. Réponses: 6
    Dernier message: 07/06/2006, 12h41

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