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 :

Meilleur moyen de populer une Combobox depuis une base de données


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Miles Raymond
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2005
    Messages : 189
    Par défaut Meilleur moyen de populer une Combobox depuis une base de données
    Bonjour !

    Mon intitulé à dût certainement faire soupirer pas mal de programmeur (il y a bien 30'000 moyens de trouver une solution), mais ma question est plus une forme d'analyse : à partir d'une table ultra-simple, je remplis deux combobox.

    Ma base de donnée intitulée "cp" contient les champs suivant :

    id_cp | cp | ville

    Cette base contient en fait tous les codes postales et ville de Suisse. Ensuite, l'utilisateur sélectionnera soit le nom de la ville, soit le numéro de code postale. Les deux CBbox étant liées en sélectionnant le code 1200, par exemple, on tombera sur Genève dans l'autre cb.

    La récupération de ces données est très simple. Mais j'ai volontairement pris un exemple simple pour me dépêtrer un peu avec la lenteur générale que j'ai constaté en travaillant sous VB.Net avec des DB (postgres ici). Lenteur très certainement dût à mes propres compétences

    J'ai tout d'abord effectués quelques essais de requête en voyant le temps nécessaire pour la charger.

    Premier essai : sans index
    SELECT * FROM cp;
    > 200 ms (entre 220 et 240ms)

    Deuxième essai : index sur cp + ville
    SELECT * FROM cp;
    < 200 ms (entre 160 et 180ms)

    SELECT cp,ville FROM cp;
    < 150 ms (entre 130 et 150ms)

    Troisième essai : index sur cp
    Même chose qu'au dessus

    Je constate donc que sur ma DB de 5000 lignes, un index peut changer le temps de requête, mais d'à peine 100ms (dans un cas aussi simple que celui-ci donc). Donc, toujours dans ce cas-ci, à moins que vous n'ayez d'autre suggestions, ce n'est pas vraiment au niveau de la base qu'il faut regarder.

    C'est donc au niveau de l'envoi des données dans la CB. Et autant dire qu'un simple DataSource ne fait pas des miracles : c'est plutôt lent. Sans même effectuer une requête, en utilisant une DataSource DEJA créée, le temps de "population" de mes CB est loins d'être négligeable, c'est de l'ordre de 3 à 5 secondes, voir plus (je parle des "pires" résultats cependant). Je doute que le remplissage manuel avec un DR soit beaucoup plus rapide.

    J'ai également fait le tests un peu grossier de la remplir à partir d'un fichier XML : pas plus rapide.

    Donc selon vos expériences, qu'elle est la solution la plus rapide ? Y a t'il une alternative ? (auto-completion dans un textbox, etc)

    Merci d'avance (et merci pour ceux qui m'ont lu jusqu'ici !)

  2. #2
    Membre émérite Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Par défaut
    Si tu as 5000 lignes à ajouter à un combobox, c'est plutôt normal que ce soit lent. Je pense que tu devrais revoir ton UI et changer la façon dont on sélectionne un code postal ou une ville. Cela ne doit pas être évident de choisir une ville précise dans un combo de 5000 items.

    Suggestion: un champ texte libre, qui dès qu'au moins 3 caractères sont entrés ira faire un query sur la table avec une where clause sur ce que l'utilisateur à entré. Ensuite, libre à toi de conserver la combobox avec un subset des informations, ou un listview, etc.

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2003
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 311
    Par défaut
    Une chose que j'ai déjà remarqué aussi est qu'il vaut mieux trier ses données dans la requête SQL et mettre l'attribut Sorted à false...

    Laisser le combobox trier lui-même les données est vraiment très lent.

    Après, c'est vrai que 5000 lignes à ajouter ça prend un peu de temps, parce que je crois que le contrôle se redessine à chaque ajout...

  4. #4
    Membre émérite Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Par défaut
    @zoubidaman : c'est évident, il faut trier côté DB!

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Petite remarque en passant : s'il n'y a pas de clause WHERE dans ton SELECT, le fait qu'il y ait ou non un index ne change strictement rien aux performances (en théorie du moins), le SGBD parcourra toute la table de toutes façons. Un index permet de rendre plus rapides les recherches et les tris sur les colonnes indexées, mais si tu ne fais pas de recherche ou de tri ça n'apporte rien.
    A mon avis les différences que tu as observées ne sont pas liées à l'index

    Pour les perfs du remplissage de la combobox, si tu ajoutes les éléments un par un, il faut appeler BeginUpdate avant de commencer et EndUpdate quand c'est fini, pour éviter que la combobox se rafraichisse à chaque fois.

Discussions similaires

  1. Afficher une image depuis la base de données
    Par Gunny dans le forum ASP.NET
    Réponses: 9
    Dernier message: 07/01/2010, 13h21
  2. Comment faire une recherche dans une combobox et une sélection automatique
    Par VictoriusDan dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 11/12/2009, 16h17
  3. Modifier une combobox depuis une autre form
    Par piero53 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 31/03/2009, 21h51
  4. Réponses: 3
    Dernier message: 10/11/2008, 11h58
  5. Réponses: 3
    Dernier message: 16/01/2006, 16h02

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