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

VB.NET Discussion :

Lenteur Combobox Binding [Débutant]


Sujet :

VB.NET

  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 258
    Par défaut Lenteur Combobox Binding
    Bonsoir,
    Je sollicite de nouveau votre aide, car depuis 2 jours je tourne en rond et ne comprend plus rien
    Pour faire suite au post :
    http://www.developpez.net/forums/d12...-raccorde-bdd/

    j’ai repris mon appli, en remplaçant l’approche DataSet par des classes crées par EF 4 DbContext et j’ai de nouveau des pbs avec les Combobox (je commence à les haïr :-)

    J’ai 2 bases (2 classes) : contact et civilité (seulement une dizaine de lignes) reliés par une contrainte, chacune possédant un champ CiviliteID

    Si je crée mon Form Contact en n’affichant dans une TextBox que CiviliteID, ou même le libellé de celle ci venant de l’autre table (navigation table Civilite) tout va bien !
    Si j’ajoute un Combobox pour sélectionner la civilité, cela semble marcher mais si je défile un peu vite entre les contacts après une modification, j’arrive à planter l’appli !

    Ma question est donc double :
    - ai je bien configuré mon combobox ?
    - si oui, quelle méthode choisir pour permettre à l’utilisateur de choisir une valeur lisible (et pas un ID) sans Combobox ?

    Voilà ce que j’ai fait

    Le Combobox est bindé (valeur sélectionnée) sur un ContactBindingSource (voir image ci jointe)
    Je charge en local les contacts (seulement 10 pour l’essai) et les attachent au ContactBindingSource

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            Dim queryCtc = (From c In ctx.Contacts Select c).Take(10)
            queryCtc.Load()
            ContactBindingSource.DataSource = ctx.Contacts.Local.ToBindingList
    Je charge une liste des civilités (j’ai essayé également avec l’ensemble sous forme de base locale) et l’attache au combobox

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            Dim QueryCiv = From c In ctx.Civilites
                           Order By c.Ordre
                           Select c.CiviliteID, c.Libelle
            CbxCivilite.DropDownStyle = ComboBoxStyle.DropDownList
            CbxCivilite.DataSource = QueryCiv.ToList 
            CbxCivilite.DisplayMember = "libelle" 
            CbxCivilite.ValueMember = "CiviliteID
    "

    Si je ne fais que défiler entre les contacts, tout va bien !
    Si je sélectionne une autre civilité pour un contact, la CiviliteID du contact est correctement modifiée, mais si je fais défiler de nouveau les contacts, je plante !

    J’ai du encore mal configurer mon Combobox :-(
    Merci de votre aide (et votre patience)
    Bertrand
    Images attachées Images attachées  

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2012
    Messages
    337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2012
    Messages : 337
    Par défaut
    Bonsoir,

    Je pense que votre problème vient du fait qu'il manque un binding sur la propriété .SelectedValue de votre combobox CbxCivilité.

    D'après le code fournis, la combobox CbxCivilité est bien remplie avec les données de la classe Civilités mais la classe Contact ne sait pas que sa propriété CivilitéID a changée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Dim QueryCiv = From c In ctx.Civilites
                         Order By c.Ordre
                         Select c.CiviliteID, c.Libelle
     
    CbxCivilite.DropDownStyle = ComboBoxStyle.DropDownList
    CbxCivilite.DataSource = QueryCiv.ToList 
    CbxCivilite.DisplayMember = "Libelle" 
    CbxCivilite.ValueMember = "CiviliteID"
    CbxCivilité.DataBindings.Add(New Binding("SelectedValue", VotreSourceDeDonnéeContact, "LeChampCibleDeLaLiaison", True))

    Juste un petit conseil, si je peux me permettre, évitez de nommer les champs d'une liaison avec le même nom (CiviliteID dans les deux sources), on s'y perd vite quand on commence à avoir beaucoup de tables et de relations

    Pour faire simple, les combobox doivent être remplies avec des données "Libres" (CAD comme s'il n'y avait pas de relation) avec comme source une datatable, list, ou tout objet implémentant IEnumerable
    La liaison avec la source parente se fait par un DataBinding sur les propriétés .SelectedValue, .SelectedText,...

    j’ai repris mon appli, en remplaçant l’approche DataSet par des classes crées par EF 4 DbContext et j’ai de nouveau des pbs avec les Combobox (je commence à les haïr :-)
    Quels problèmes rencontriez vous avec les Dataset pour passer à des classes?

    EDIT: J'ai lu le post que vous avez mis en lien et j'aurais deux remarques :
    Personnellement, j'utilise que les Dataset, je n'ai pas encore rencontré de limites pour les applications amateur que j'ai faites.
    Je les utilise de deux manières différentes :
    Soit je remplis mon Dataset complet (CAD Schéma du Dataset identique à celui de ma base de données) au lancement de mon application sur un thread à part en commençant par les données susceptibles d'être le plus rapidement utilisées (Contacts, clients, production, RDV,...)
    Le "Remplissage" du Dataset commence à l'affichage d'un SplashScreen qui masque gentillement les lenteurs qu'il peut y avoir.
    Soit je remplis les DataTables du Dataset quand j'en ai besoin (ouverture d'un formulaire ou évènement formulaire)

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 258
    Par défaut
    Bonjour Rainui et merci pour la réponse !
    Je n'avais pas mis de binding car pour moi cela était fait au niveau "graphique" (voir copie écran 1er message) et cela a était confirmé
    - quand je modifiais l'entrée du combobox, le CiviliteId était bien modifié et enregistré
    - quand j'ai modifié mon code selon votre prescription (voir copie ci jointe) : j'ai eu l'erreur erreur "2 liaisons de collections vont être liées .."

    J'ai donc supprimé ce combobox (lié au ContactBindingSource par l'interface graphique) et en ai recrée un autre ex nihilo ... et à partir de là ça marche Nickel !!!
    Je ne comprends pas bien le pourquoi, mais je pense que le mixe graphique/code devait engendrer des pbs !

    Pour la dénomination des "propriétés/champs", j'avais lu (je ne sais plus ou) qu'il fallait absolument qu'ils soient identiques entre les 2 classes/tables, et j'ai passé pas mal de temps à tout modifier !


    L'approche Dataset me semblait plus intuitive (venant d'Access), mais j'ai abandonné pour des pbs de validation dont je n'arrivais pas à me sortir et que l'approche classe rend plus facile !
    http://www.developpez.net/forums/d12...v/#post6774365
    D'autre part, j'avais des comportements bizarres quand je modifiais de façon graphique le dataset (libellé de champ, .. ) avec des erreurs de reverse ingeneering , et j'ai du recommencer je ne sais combien de fois la même chose jusqu'à me décider à me lancer dans la POO

    En tout cas, merci encore, je crois que je n'aurais jamais trouvé tout seul
    Bertrand
    Images attachées Images attachées  

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

Discussions similaires

  1. [WPF] ComboBox, binding avec association LINQ
    Par tomlev dans le forum Windows Presentation Foundation
    Réponses: 11
    Dernier message: 30/04/2008, 00h30
  2. ComboBox Binding pour la liste et binding pour la valeur à afficher
    Par amandinerenard dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 18/02/2008, 17h29
  3. Rafraîchir une combobox bindée
    Par Zebeber dans le forum Windows Forms
    Réponses: 6
    Dernier message: 26/02/2007, 07h49
  4. [VS2005] Datagridview et combobox binding
    Par s.n.a.f.u dans le forum Visual Studio
    Réponses: 3
    Dernier message: 13/12/2006, 16h15
  5. [VS2005][C#]Formulaire, ComboBox bindings
    Par Oufti dans le forum Windows Forms
    Réponses: 8
    Dernier message: 07/06/2006, 18h14

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