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 :

Optimisation chargement Formulaire raccordé sur BDD


Sujet :

VB.NET

  1. #1
    Membre habitué
    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
    Points : 126
    Points
    126
    Par défaut Optimisation chargement Formulaire raccordé sur BDD
    Bonjour
    J’aimerais profiter de votre expérience pour progresser encore un peu dans mon application VB+SQLServer avec ce pb que je pense assez classique

    J’ai
    - une table parent « Ville » d’environ 40 000 lignes
    - une table enfant « Personne » d’environ 3000 lignes
    les 2 sont reliées par contrainte d’intégrité référentielle

    J’ai crée un Form Personne ayant pour source
    - 1 dataset DSPersonne
    - 1 dataset DSVille pour charger un combobox permettant de modifier/ajouter cette info à partir d’une liste

    Le pb est que ce Form est long à charger (env 6sec mais je n’ose imaginer ce que cela donnera sur une base de plus de 100 000 lignes)

    J’ai modifié la requête du DSPersonne pour n’en charger qu’une partie (basée sur le nom) mais cela ne me fait rien gagner de significatif au vu de la taille de la base Personne
    Le pb est lié au chargement complet de DSVille
    J’ai envisagé plusieurs solutions mais j’aimerais connaître celle qui est la plus utilisée/efficace
    - remplacer le Dataset Ville par un Data reader (je n’ai pas de modification à faire sur la table ville), mais je ne sais pas si je gagnerai beaucoup de temps
    - ne charger au démarrage que les villes liées aux personnes, mais dans ce cas pour un ajout/modif il faudra bien charger la table complète à un moment donné :
    -- en temps masqué ?
    -- sur un Form spécifique ajout/modif ?
    Par avance, merci
    Bertrand

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    le dataset est pratique pour les débutants, mais ne permet pas de grandes modifications

    avec un datareader qui ne fait que lire les lignes, on fait ensuite ce qu'on veut, de plus le traitement sera en général plus rapide que de remplir un dataset

    à partir de là, tu peux charger tes 2 tables sur un autre thread, avec par exemple ajout au fur et à mesure dans l'interface (toutes les 1000 lignes lues par exemple)
    ca fera une ouverture avec déjà quelques milliers de lignes visibles en moins d'une seconde
    (voir backgroundworker pour le multithreading)

    pour le stockage des données tu peux faire une classe et utiliser un system.collections.generic.dictionary(of type_cle, type_classe)

    un combobox avec 40k choix me parait aberrent sinon ^^
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre habitué
    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
    Points : 126
    Points
    126
    Par défaut
    Bonsoir Pol63 et merci de cette réponse rapide !
    Effectivement les Dataset sont beaucoup plus faciles à utiliser, c'est pourquoi je pensais dans un premier temps m'en servir et ne garder les Datareader que pour remplir les listes (sans modif) des Combobox
    Ce qui me rebute avec le "tout code", ce sont les km de lignes pour ne serait ce qu'ajouter un élément dans la BDD, la gestion de l'ordre des modif pour respecter les intégrités différentielles,... et ce pour chaque Form !!
    J'ai beau lire plein de bouquins là dessus, j'arrive pas à m'en faire une idée assez claire pour le taper sans le "recopier", j'en oublie donc toujours la moitié !

    Pour le backgroundworker , je ne connaissais pas, mais cela me semble une bonne piste à creuser : merci !

    Effectivement 40k dans un combobox, ça fait beaucoup mais
    - il y bcp de communes en France !
    - à l’utilisation je n'ai jamais ressenti de gêne (tout au moins sous Access) grâce à l'auto-complétion.
    Mais peut être serait ce une autre piste :
    - charger les villes correspondant au contact (donc env 3000)
    - puis pour la saisie ne charger que les villes qui commencent par xx
    mais il faudrait jongler sur les propriétés du Combobox, et là j'ai encore du travail
    De plus cette liste me sert avec plusieurs tables / Form donc la garder en mémoire n'est pas forcément stupide (sauf si multi-utilisateurs)

    Merci encore, j'ai de quoi creuser !
    J'avance tout doucement, mais j'avance :-)
    Bertrand

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    quand on code bien, le dataset fait peut etre plus de lignes de code que les datareader et autres command ^^
    par contre il faut faire du code générique, c'est sur que si tu tapes chaque requete ca peut commencer à faire
    enfin déjà il faut une classe d'accès aux données à laquelle tu ne donnes que la requete, ca évite de créer les objets connexion command et autres partout dans le code
    ou sinon des choses comme Entity Framework, je ne suis pas sur que c'est la panacée pour faire du multithreading progressif avec, mais c'est encore plus pratique et orienté objet que les datasets

    40k lignes en ram ce n'est pas génant du tout, et dans le combobox avec l'autocomplétion c'est vrai que ca va aussi
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre habitué
    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
    Points : 126
    Points
    126
    Par défaut
    J'ai essayé le BackgroundWorker : .......... et ça ne marche pas !
    Je pense que le Combobox ayant été crée de façon graphique, il essaie dés le chargement du Form de se charger avec un dataset .. qui lui n'est pas encore chargé (BackgroundWorker), le combobox reste donc vide !!
    Il ne me reste plus qu'à passer par du code (datareader : ça je devrais savoir faire!) pour ne charger le combobox que lorsque le BackgroundWorker à fini sa tache !
    Je me suis déja fait des getdataset, getdatareader.. pour remplir des datagridview en lecture seule
    mais le mélange graphique/code me pose des pb et je suis complétement perdu
    je ne vois pas comment charger mon combobox en code en ayant conçu le Form de façon graphique

    En graphique le Combobox à 4 propriétés :
    - Source de données : VilleBindingSource
    - Afficher le membre : LibelleVille (table Ville)
    - Membre value : IDville (table Ville)
    - Valeur sélectionnée : IDville (de mon dataset Contact)

    En code, je n'en retrouve que 3
    - DataSource : mon datareader
    - DisplayMember :Libelleville provenant de mon datareader
    - ValueMember : ID venant de (ville ou contact) ??

    Ou alors créer un VilleBindingSource à partir de mon datareader ?

    je continue mes recherches pour éclaircir ça !
    Merci
    bertrand







    -> datareader ou dois je crée en code

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Valeur sélectionnée c'est SelectedItem
    tu peux aussi passer par SelectedValue en mettant la valeur d'IdVille

    par contre dans datasource, tu ne peux pas mettre un reader, on met soit un dataset, soit un datatable, soit une collection (auquel cas il te faudrait une classe Ville)

    Le combobox quand on lui donne des instances de classes, on peut lui donner un displaymember et/ou valuemember aussi, il utilisera les propriétés dont on lui donne les noms
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre habitué
    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
    Points : 126
    Points
    126
    Par défaut
    Désolé, je m'enfonce !!

    faire un dataset en code à partir d'un datareader, je sais faire !
    J'obtiens donc un dataset que j'appelle datasetVille contenant : IDVille, LibelleVille
    Par contre, je ne vois pas pourquoi ce dataset serait plus rapide que celui crée par l'interface graphique (??) et il ne sera "disponible" qu'à la fin du BackgroundWorker donc si j'utilise le combobox crée graphiquement je crois que je retombe dans le même pb ?

    If me faut donc un combobox entièrement en code pour pouvoir gérer son chargement à la fin du BackgroundWorker

    mais après je pédale dans la semoule car pour moi il manque un paramètre, à moins que VB comprenne tout seul que TableContact.IDville = TableVille.IDville !!!

    je ne comprends pas :
    Citation Envoyé par Pol63 Voir le message
    Le combobox quand on lui donne des instances de classes, on peut lui donner un displaymember et/ou valuemember aussi, il utilisera les propriétés dont on lui donne les noms
    je peux effectivement taper
    ComboBox.DataSource -> dataSetVille ?
    ComboBox.DisplayMember ->
    ComboBox.ValueMember -> ??
    mais je ne sais plus quoi y mettre pour moi il manque un paramètre, à moins que VB comprenne tout seul que TableContact.IDville = TableVille.IDville !!!
    et il faut que je le raccroche à l'enregistrement courant du datasetContact ?

    Désolé, je patauge, et si ma prose et aussi claire que mon esprit, ça ne doit pas être facile à lire :-) !
    bertrand

  8. #8
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Bonsoir,

    j'avais eu ce problème, 70.000 enregistrements lié au ComboBox en 13 secondes, une éternité .
    J'avais résolu ce problème en changeant le combobox par une textbox avec AutoCompleteSource, ci ca peut t'aider : http://www.developpez.net/forums/d10...eaucoup-temps/

    P.S. : Ce n'est pas le chargement qui met du temps mais la liaison comboBox vs source de données...

  9. #9
    Membre habitué
    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
    Points : 126
    Points
    126
    Par défaut
    Merci ça m'a fait apprendre le Stopwatch

    'ai fait quelques mesures et réalisé que la notion de temps est vraiment subjective :-)

    Mon Form.load ne comprend pour ainsi dire que le chargement de la base Ville
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Me.VILTableAdapter.Fill(Me.VILLookupDataSet.TE_VILLE_VIL)
    Si je mets le stopwatch autour de cette ligne, j'obtiens
    1.94s au premier lancement puis 1.6s aux lancements suivants

    Si je mets le stopwach dés le début et l'arrête à la fin du form.load , j'obtiens
    2.93s au premier lancement puis 1.6s aux lancements suivants

    Note : c'est encore très acceptable, mais j'ai un peu peur pour mes tables de 100000 lignes, et ce qui me surprend le plus est que sous Access, on n'a pas ce sentiment de lenteur

    Ne sachant pas bien ce qu'il garde en mémoire, ni le déroulement des opérations, je ne saurais dire si ce qui prend le plus de temps est le chargement ou le transfert dans le combobox avec auto-complétion

    PS : Et comme je ne suis pas dans un bon jour, je viens de me rendre compte que cette fonction n'est pas activée, ni activable ("Seule la valeur de AutoCompleteMode.None peut être utilisée lorsque DropDownStyle est ComboBoxStyle.DropDownList et AutoCompleteSource n'est pas AutoCompleteSource.ListItems.")

    Je l'avais basculé de DropDown à DropDownList pour éviter de pouvoir modifier le texte (mais dans ce cas ça n'a pas d'importance) sans me rendre compte que l'auto-complétion avait été supprimée

    J'ai donc remis DropDown + Auto-complétion et refait le test 1 : sensiblement même résultat

    Je crois donc que
    - chargement de la table ville : env 2s
    - chargement du form : env 1s
    Bertrand

  10. #10
    Membre habitué
    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
    Points : 126
    Points
    126
    Par défaut
    Etant têtu, j'ai recopié (sans tout comprendre) un code sur un bouquin pour créer une classe, et utiliser un datareader pour remplir un combobox
    Mais étant mauvais élève même en trichant ça ne marche pas

    j'ai crée un classe ville avec comme propriété NomVille et IDVille

    J'ai ensuite crée une classe villeDB

    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
    Public Class VilleDB
        Public Shared Function GetListeVille() As List(Of Ville)
            Dim ListeVille As New List(Of Ville)
            Dim MaConnexion As SqlConnection = New SqlConnection(Connexion1) 
    ' Connexions1 chaine de connexion prédéfinie
            Dim MaCommande As SqlCommand = MaConnexion.CreateCommand()
            MaCommande.CommandText = "SELECT VIL_ID, VIL_LIB FROM TE_VILLE_VIL ORDER BY VIL_LIB"
     
            Try
                MaConnexion.Open()
                Dim mondataReader As SqlDataReader = MaCommande.ExecuteReader()
                Dim ville As Ville
                Do While mondataReader.Read
                    ville = New Ville
                    ville.IDVille = CInt(mondataReader("VIL_ID"))
                    ville.NomVille = mondataReader("VIL_LIB").ToString
                    ListeVille.Add(ville)
                Loop
                mondataReader.Close()
            Catch ex As Exception
            Finally
                MaConnexion.Close()
            End Try
            Return ListeVille
        End Function
    End Class
    j'ai ensuite crée un btn pour remplir le combobox
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub btn_charge_comboboxVille_Click(sender As System.Object, e As System.EventArgs) Handles btn_charge_comboboxVille.Click
            Dim ListeVille As List(Of Ville)
            Try
                ListeVille = VilleDB.GetListeVille
                ComboBoxVille.DataSource = ListeVille
                ComboBoxVille.DisplayMember = "VIL_LIB"
                ComboBoxVille.ValueMember = "VIL_ID"
     
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
     
        End Sub
    Quand je clic, j'obtiens le message d'erreur
    Liaison au nouveau membre display impossible . Nom du paramètre : newDisplayMember
    Est ce du à
    "Le combobox quand on lui donne des instances de classes,.."
    et même si cela marchait, je ne sais comment raccrocher ce combobox à ma source Contactdataset
    Bonne soirée !
    bertrand

  11. #11
    Membre du Club
    Homme Profil pro
    informatique
    Inscrit en
    Avril 2012
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : informatique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2012
    Messages : 89
    Points : 46
    Points
    46
    Par défaut
    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
            Dim ds As New DataSet
            Dim da As New SqlDataAdapter
            Dim cmd As New SqlCommand
            Dim cb1 As New ComboBox 
    conn.Open()
            cmd = conn.CreateCommand
            cmd.CommandText = "SELECT * FROM Nom_Table"
            cmd.ExecuteNonQuery()
            'chargement de la datagridview par un dataset
            da.SelectCommand = cmd
            MonDataGridView.DataSource = GIMDataSet
            da.Fill(ds, "Locataires")
            Me.MonDataGridView.DataSource = ds.Tables("Nom_Table")
     
     
            cb.DataSource = ds.Tables("Nom_Table")
     
            cb.DisplayMember = "Nom" 'le nom du champs que tu veu charger sur le combobox
    je suis un simple d'ébutant ne frape passi mes idées ne sont pas bonnes .test sava marché

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    pour displaymember et valuemember, avec un dataset on met le nom de la colonne
    avec une classe on met le nom de la propriété de la classe ("IDVille" et "NomVille" donc)
    une classe n'a rien à voir avec une table, les données qui la remplisse ne viennent pas forcément d'une table, et même si c'est le cas elle ne peut pas le savoir
    en donnant le nom de la colonne au combobox, celui est bien incapable de l'utiliser
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  13. #13
    Membre habitué
    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
    Points : 126
    Points
    126
    Par défaut
    Bonjour,
    Lilifa,
    merci pour cette suggestion, je vais regarder ce que cela donne avec un dataset, mais à la première lecture, je n'ai pas bien compris le pourquoi du datagridview

    Pol63,
    Quand je disais que je n'avais pas tout compris, c'est de cette partie à laquelle je pensais
    Intuitivement je pensais mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ComboBoxVille.DisplayMember = Nomville ' ou alors
    ComboBoxVille.DisplayMember = ville.Nomville
    mais l'intellisense me le refuse
    cela doit donc venir de ma déclaration de la classe Ville
    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
    Public Class Ville
     
        Private _NomVille As String
        Private _IDVille As Integer
     
     
        Public Property NomVille() As String
            Get
                Return _NomVille
            End Get
            Set(ByVal value As String)
                _NomVille = value
            End Set
        End Property
     
     
        Public Property IDVille() As Integer
            Get
                Return _IDVille
            End Get
            Set(ByVal value As Integer)
                _IDVille = value
            End Set
        End Property
    Les classes Ville et la VilleDB sont déclarées dans le même fichier ville.db
    Dans la déclaration de la class VilleDB, j'ai bien accès à ville.NomVille, ne serait pas un pb de visibilité des class ?


    Merci encore
    Bertrand

  14. #14
    Membre habitué
    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
    Points : 126
    Points
    126
    Par défaut
    Re,
    ce n'est pas un pb de visibilité de class comme je le pensais car dans la sub btn_charge_comboboxVille je peux taper
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            Dim Lille As New Ville
            Lille.NomVille = "Lille"
            Lille.IDVille = 2
    Reste à trouver la bonne instruction ..
    Bertrand

    Edit 1
    Re, re

    j'ai remplacé le combobox par un datagridview avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DataGridView1.DataSource = ListeVille
    ça marche, temps de chargement : 0.3s
    le pb vient donc des instructions du Combobox !
    Bertrand

    Edit 2
    Re,Re,..
    Bon j'ai trouvé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                ListeVille = VilleDB.GetListeVille
                ComboBoxVille.DataSource = ListeVille
                ComboBoxVille.DisplayMember = ("NomVille")
                ComboBoxVille.ValueMember = ("IDville")
    Temps de chargement du combobox : 3.7s puis 1.6s

    par contre, comment je fais pour le lier à ma table Contact (via IDville) ??
    Merci
    bertrand

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par 105rn2 Voir le message
    Intuitivement je pensais mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ComboBoxVille.DisplayMember = Nomville ' ou alors
    ComboBoxVille.DisplayMember = ville.Nomville
    mais l'intellisense me le refuse
    le but n'est pas de marcher à l'intuition
    il faut apprendre à utiliser l'intellisense et la logique
    quand tu tapes ComboBoxVille.DisplayMember, l'intellisense te précises que DisplayMember est As String, donc il faut lui donner un string
    un string en vb.net est encadré de " ; ou alors donner une variable as string ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ComboBoxVille.DisplayMember = "Nomville"
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  16. #16
    Membre habitué
    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
    Points : 126
    Points
    126
    Par défaut
    ça avance tout doucement
    l'instruction pour lui assigner un contact (en lecture) est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ComboBoxVille.SelectedValue = ComboBox2.SelectedValue
    Par contre je n'ai pas encore trouvé comment définir l'IDVille, c'est pourquoi sur mon essai j'ai recopié la position du combobox défini par l'interface graphique
    je pensais à qqchose comme
    ContactDataset.TableContact.??
    ou alors dois je recréer une requete pour trouver la valeur IDVille correspondant au contact en cours
    ça commence à faire lourd !!
    bertrand

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    pas sur d'avoir compris ...

    sur ta classe Personne, il faut mettre un IdVille, comme ca tu fais personne.IdVille pour le retrouver
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  18. #18
    Membre habitué
    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
    Points : 126
    Points
    126
    Par défaut
    Désolé, je me suis mal expliqué !
    Pour l'instant je n'ai pas de class Personne :-( de l'inconvénient de vouloir marier code et graphique)
    J'ai crée le Form Contact avec l'interface graphique, la valeur IDVille est donc dans le Contactdataset et ContactBindingsource crées automatiquement
    Si je dois recréer une requête pour la retrouver dans le dataset, ça commence à faire lourd !
    Bertrand

  19. #19
    Membre habitué
    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
    Points : 126
    Points
    126
    Par défaut
    Re
    Pour tricher, j'ai fait glisser une textbox contenant IDVille

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        Private Sub ContactBindingSource_CurrentChanged(sender As System.Object, e As System.EventArgs) Handles ContactBindingSource.CurrentChanged
            If txt_VilID.Text.Length <> 0 Then
                ComboBoxVille.SelectedValue = CInt(txt_VilID.Text)
            End If
     
        End Sub
     
        Private Sub ComboBoxVille_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles ComboBoxVille.SelectedIndexChanged
            If ComboBoxVille.SelectedValue.ToString.Length <> 0 Then
                txt_VilID.Text = ComboBoxVille.SelectedValue.ToString
            End If
     
        End Sub
    ça marche (lecture/écriture) , mais ce n'est pas élégant !
    Bertrand

  20. #20
    Membre habitué
    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
    Points : 126
    Points
    126
    Par défaut
    j'ai fait plus simple (et efficace)
    Dans le combobox crée graphiquement, j'ai supprimé source de donnée/value/.. bref le VILBindingsource en laissant valeur sélectionnée à ContactBindingsource
    Et ça marche !! mais c'est plus long que l'autre méthode (5.024 au lieu de 3.01s) :-(
    J'ai essayé le BackgroundWorker, mais il me donne une erreur de threat : a priori on ne peut pas modifier un élément du Form pendant l'action du BackgroundWorker (et c'est ce que j'essaie de faire en chargeant le combobox)
    Bref, j'ai bcp appris mais je n'ai pas encore solutionné mon pb
    Je pense que la solution du Dataset donnera des résultats sensiblement identiques que celle graphique
    Existe t il (j'ai pas trouvé) un événement form.loaded ? (je pourrais alors charger la liste une fois le formulaire chargé, pour donner une impression de rapidité)
    Bertrand


    Bertrand

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [AC-2007] Formulaire impossible sur relation plusieurs à plusieurs - BDD Musique
    Par moononuk dans le forum Modélisation
    Réponses: 5
    Dernier message: 06/11/2013, 15h01
  2. [WD16] Optimiser les opérations sur BDD lourde
    Par JustineJ dans le forum WinDev
    Réponses: 16
    Dernier message: 04/01/2012, 17h34
  3. [AC-2000] Conflit d'ouverture de formulaire sur bdd scindée
    Par gravier3000 dans le forum IHM
    Réponses: 3
    Dernier message: 28/10/2010, 16h52
  4. Réponses: 18
    Dernier message: 11/03/2008, 10h23
  5. [Débutant] Tester une connection sur bdd
    Par lando dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 03/09/2003, 14h37

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