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 :

[VB.NET] [DataTable] Un DataTable et plusieurs Combos?


Sujet :

Windows Forms

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2003
    Messages : 11
    Par défaut [VB.NET] [DataTable] Un DataTable et plusieurs Combos?
    Bonjour,

    Je récupère dans un DataTable une liste de noms que j'affiche dans un ComboBox (lié donc à mon DataTable).

    Il n'y a pas qu'un seul ComboBox de ce type (liste de nom, toujours les mêmes, c-à-d. ceux de la table "personnes" dans ma DB) mais plusieurs ComboBox qui affichent les mêmes noms pour des champs différents de mon formulaire.

    Exemple la personne "responsable" et "assistant resposable". Il s'agit de 2 champs différents mais la liste de noms est la même. Si je lie mes 2 combobox différents au même datatable avec .valuemember et .displaymember le problème c'est que ce qui est sélectionné dans un combobox se sélectionne partout... Comme sit les combobox sont tous dépendants les uns des autres (ou liés, comme si le changement d'un lselectedvalue chez un combobox change cette propriété partout). C'est pas mon but.

    Suis-je donc obligé de créer un DataTable différent pour chaque combobox? Ca devient vite peu gérable...

    Merci pour vos tuyaux!

  2. #2
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Par défaut
    C'est parcequ'en mémoire, ton datatable etant le meme, les deux datasource des combo pointent sur le meme espace.

    Donc fais une copie de ton datatable pour autant de combo que tu as et ca marchera.

    @+

  3. #3
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    Je soupçonne tout de même un gros souci de conception
    Peux-tu prendre le temps de nous décrire de façon formelle la table (côté BDD) concernée (Champs)
    Puis pour chaque ComBoBox les propriétés DataSource etc...
    Car je ne comprends pas bien l'intérêt fonctionnel de ce que tu présentes à l'utilisateur. Si de principe les données affichées sont indépendantes alors comment se fait-il qu'elles soient presentes dans une seule table côté BDD :

  4. #4
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Par défaut
    Neguib,
    Je ne peux pas répondre à sa place mais si apparemment c'est des combos pour choisir des personnes, ca a un sens pour moi, car il peut n'avoir qu'un table Personne avec un champ Nom et un champ Métier par exemple, et suivant la combo dont le nom provient, le champ Métier sera différent. C'est mon interprétation de son post...

  5. #5
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    Citation Envoyé par graphicsxp
    Neguib,
    Je ne peux pas répondre à sa place mais si apparemment c'est des combos pour choisir des personnes, ca a un sens pour moi, car il peut n'avoir qu'un table Personne avec un champ Nom et un champ Métier par exemple, et suivant la combo dont le nom provient, le champ Métier sera différent. C'est mon interprétation de son post...
    effectivement vaut mieux son avis car ce que tu decris est bien cette fois des données liées donc no problemo car il est normal que le BindingContext lie tous les combos

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2003
    Messages : 11
    Par défaut
    Merci pour vos réponses!

    Pour la conception, j'ai un table Personnes qui contient les coordonnées des personnes et une autre table liée à la table Personnes qui, entre autre, indique les id des personnes qui occupent telle ou telle fonction. Donc pas de problème de concetpion DB, je suis justement en 3ème forme normale.

    Je dois donc disposer de plusieurs DataTable pour éviter la situation que j'ai décris...

    Actuellement, je construit mon DataTable avec la procédure suivante:

    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
    Public Sub buildDataTablePersonnesListe()
            Dim strSQL As String
            strSQL = "SELECT personne_id, personne_nom & ', ' & personne_prenom AS personne_AGGR_nomPrenom FROM personnes ORDER BY personne_nom, personne_prenom"
            cnx = New OleDbConnection()
            cnx.ConnectionString = functions.DBconnexionString
            cnx.Open()
            command = New OleDbCommand(strSQL)
            da = New OleDbDataAdapter(command)
            command.Connection() = cnx
            cnx.Close()
            ds = New DataSet
            da.Fill(ds, "PersonnesListe")
            dtPersonnesListe = New DataTable()
            dtPersonnesListe = ds.Tables("PersonnesListe")
        End Sub
    Avec les variable suivantes déclarées au niveau de mon module:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Public cnx As OleDbConnection 'objet Connexion
        Public command As OleDbCommand 'objet Command
        Public da As OleDbDataAdapter 'objet DataAdapter
        Public ds As DataSet 'objet DataSet
    Plutôt que créer une nouvelle version de buildDataTablePersonnesListe(), comment puis-je copier mon DataTable autant de fois que j'ai de combobox qui l'utilisent?

    Merci...

  7. #7
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Par défaut
    Utilises tout simplement la méthode Copy.

    Combo1.Datasource = tonDatatable
    Combo2.Datasource = tonDatatable.Copy()

    Et ca devrait fonctionner.

  8. #8
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    Bonjour à tous,
    Mais si je comprends bien, tu ramènerais chaque fois (avec la méthode Copy) une DataTable qui contient l'intégralité de la table personnes, sur laquelle tu va plus tard filtrer en fonction de données dans une autre dataTable... c'est ça ?

    alors est-ce que tu n'aurais pas intérêt à faire un Select un poil plus évolué en DataBase pour ne ramener que les données concernées par la combo que tu charges ?

    ce ne serait pas très compliqué de faire une fonction dont le(s) paramètre(s) détermine la clause WHERE du Select, et qui retourne la DataTable que tu veux utiliser...

    un exemple :
    voilà une fonction que j'utilise pour ramener une DataTable en fonction d'un paramètre ID

    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 Function GetActivePrincipleDetailForOil(ByVal id As Integer) As DataTable
            Dim tmpDT As New DataTable
            Dim DA As New SQLite.SQLiteDataAdapter
            Dim cmd As New SQLite.SQLiteCommand
     
            cmd.CommandText = "Select " _
                               & "A.ActivePrincipleCategory as Catégorie " _
                               & ", A.ActivePrincipleName as Nom " _
                               & ", A.Rate as Taux " _
                               & "from ACTIVEPRINCIPLE as A" _
                               & ", FKTAB_OIL_ACTIVEPRINCIPLE as B" _
                               & " where B.Oil_i = " & id _
                               & " And A.ActivePrinciple_i = B.ActivePrinciple_i" _
                               & " Order by 1 "
            cmd.Connection = myConn
            DA.SelectCommand = cmd
            DA.Fill(tmpDT)
            tmpDT.TableName = "FKTAB_OIL_ACTIVEPRINCIPLE"
     
            Return tmpDT
            tmpDT.Dispose()
            DA.Dispose()
            cmd.Dispose()
        End Function
    puis tu peux Binder ta combo à la table ainsi retournée...

    Désolé que cet exemple que j'avais sous la main ne soit pas adapté à ton modèle de donnée... mais ça peux te donner une idée de départ...

    enfin en tout cas moi je préfère faire le job "lourd" (extraction, filtres, etc) sur le serveur de base de donnée... il est fait pour ça !

  9. #9
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Par défaut
    Salut Yorglaa,
    J'aurais tendance à penser comme toi. Seulement si j'ai bien compris son probleme, les combos sont remplis avec des noms de personnes provenant d'une table 'Personne' et rien ne les différencie. Je suppose qu'une fois sélectionnées dans les combo, cela change la propriété 'Métier' de la table ('Responsable', 'Assistant Responsable'...)
    Dans ce cas, et à cause du probleme de pointeur que j'ai souligné plus haut, je ne vois trop ce qui pourrais remplacer Copy(). Cela dit si quelqu'un a une autre solution...

  10. #10
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    Salut graphicsxp,
    en effet je vois ton point de vue...
    en fait il faudrait que Giuseppe nous dise si il veut que :
    1. les combo ne doivent afficher QUE les personnes en fonction d'un filtre appliqué au préalable, auquel cas ma solution s'applique
    2. c'est le CHOIX de la première combo qui détermine le set d'occurences ramenées dans les suivantes, et là c'est ta solution qui prime !

  11. #11
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    En fait, si c'est la solution B. il faudrait faire un mix des 2 solutions...

    c'est à dire la première combo ramène tout, puis les autres combo se chargent avec ma fonction qui ne ramène QUE les rows concernées par le paramètre déterminé par le SelectedValue de la première combo... quitte à appliquer le filtre sur en local sur la DataTable source, puis COPY sur les rows restants si on ne veut pas refaire une transaction sur la DB.

  12. #12
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Par défaut
    Mais si je lis son premier post, je n'ai pas l'impression que les autres combos soient remplis en fonction de ce qu'il y a dans la premiere ! Je crois qu'elles sont indépendantes.

    En revanche, une personne ne peut pas etre a la fois 'Responsable' et 'Assistant Responsable' (encore que c'est à Giuseppe de nous le confirmer), et donc si tu selectionnes un nom dans la premiere combo, il faudrait qu'il soit retiré de la liste pour les autres combo.

    Par conséquent je pense qu'il lui serait plus simple de travailler avec un array d'Object ou un ArrayList qu'il pourrait facilement mettre à jour, plutot que de passer par un datatable, moins facilement manipulable.

    C'est mon point de vue en tout cas

  13. #13
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    Citation Envoyé par graphicsxp
    ... plutot que de passer par un datatable, moins facilement manipulable.

    C'est mon point de vue en tout cas
    : : : il faut juste savoir ce que l'on veut en tirer precisement
    le souci ici c'est que la problématique est en posé en terme de design (combo machin etc...) alors qu'effectivement nous n'avons que très peu d'elements structurels

  14. #14
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Par défaut
    Neguib,
    Par 'moins facilement manipulable' je voulais dire qu'il est plus simple de maintenir un tableau d'élement qu'un datatable coté client; je pense qu'il va falloir attendre que Giuseppe nous donne plus de précision.

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2003
    Messages : 11
    Par défaut
    Bonjour à tous les trois et merci pour vos réponses, je vois que ma question à fait couler un peu d'encre (ou des pixels... ;-)

    Je confirme que:

    - tous les enregistrements (personnes) de ma table sont récupérer pour alimenter mes combobox, sans filtre (clause where) particulier

    - tous les combobox doivent contenir l'ensemble des personnes et donc les même entrées (mêmes items, quel que soit l'item sélectionné dans les autres combobox)

    - l'utilisateur doit pouvoir sélectionner n'importe quelle personne (différente ou même une déjà sélectionnée) dans chaque combobox

    C'est donc simplement la méthode Copy() que je retiens.

    Merci encore à tous!

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

Discussions similaires

  1. [VB.NET] Récupérer une dataTable dans le cache
    Par nine93 dans le forum ASP.NET
    Réponses: 3
    Dernier message: 12/03/2007, 14h07
  2. [ADO.NET] Dataset et DataTable
    Par gibea00 dans le forum Accès aux données
    Réponses: 4
    Dernier message: 15/12/2006, 04h49
  3. [C++.NET] Egalite entre datatables
    Par raboin dans le forum VC++ .NET
    Réponses: 5
    Dernier message: 06/06/2006, 15h59
  4. Réponses: 1
    Dernier message: 24/03/2006, 18h59
  5. [vb.net] convertir dataview -> datatable
    Par graphicsxp dans le forum Windows Forms
    Réponses: 47
    Dernier message: 31/10/2005, 16h14

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