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 :

Utiliser IbindingList ou BindingSource


Sujet :

C#

  1. #1
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut Utiliser IbindingList ou BindingSource
    Bonjour

    Jusqu'ici je n'emploie que tres rarement les BindingSouce car elle ne m'apportent rien dans la majorité des cas

    - Binder une datatable sur un DGV

    - Ou m'empechent une astuce amusante
    Binder une datatable sur plusieurs combo permettant la recherche d'un row sur plusieurs colonnes

    Parfois je l"emploie pour binder des List<T> sur un DGV afin de permettre le Add et Delete

    Question :

    Vaut il mieux utiliser un BindingSource
    Ou ajouter l'interface IbindingList dans la classe qui definit ma liste

    Quels seraient les pour et contre ?

  2. #2
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    BindingSource est surtout utile quand plusieurs contrôles sont bindés à un même objet métier / une même liste d'objets métier. Perso j'aime bien m'en servir ; quand on code la partie "UI", ça uniformise pas mal. Ca gère un élément "Current", par exemple, que je préfère utiliser plutôt que chercher dans la grille quel est l'élément courant.

    Disons que le binding fonctionne avec IList, IBindingList, IBindingListView ; chacune de ces interfaces est un héritage de la précédente. IList ne gère que le parcours et l'ajout, IBindingList gère en plus le tri et la notification, IBindingListView gère aussi le tri multiple et le filtrage. Mais BindingSource, en lui-même, ne filtre pas ; il se contente de rediriger toutes les demandes de tri et de filtre à sa source. C'est qu'un tuyau.

    Après, il est certain qu'il manque au framework une implémentation de IBindingListView. A ma connaissance, seule la DataView l'implémente...

  3. #3
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Merci Guulh

    Pratiquement
    Ce que j'avais constaté, c'est ceci

    1- Si tu bind une liste direct sur un dgv : pas de tri pas d'ajout pas de delete
    2- Si tu bind une liste a un dgv via binding source : pas de tri MAIS ajout et delete autorisé
    3- Si tu derive IBindDingList dans la liste tu peux faire un bind direct de la liste sur le DGV avec tri,ajout et delete (pour autant que les methodes respectives soient définie dans l'interface)

  4. #4
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    J'ai constaté les mêmes choses (heureusement, quelque part ) effectivement l'utilisation d'une BindingSource enrichit un peu le comportement des List.

    Mais c'est une couche d'abstraction que j'aime bien. Tous les contrôles sont plugués à des BS, tous les BS sont plugués à des objets métier, et go (aussi bien les contrôles simples tels que la textbox, liés à un objet unique, et les contrôles de type liste tels que la listview, la dgv, etc.)

  5. #5
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Citation Envoyé par Guulh Voir le message
    Mais c'est une couche d'abstraction que j'aime bien. Tous les contrôles sont plugués à des BS, tous les BS sont plugués à des objets métier, et go (aussi bien les contrôles simples tels que la textbox, liés à un objet unique, et les contrôles de type liste tels que la listview, la dgv, etc.)
    Complètement +1
    Cela permet en effet de découpler un peu l'interface et les objets métier.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  6. #6
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Salut Saumont agile

    Heueee ?
    Dans tous les cas vraiment ?

    Prenons un cas simple : une datatable et un DGV

    Cas 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dgv.datasource=MaDataTable;
    Cas 2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    BindingSource MaBDS=new BindingSource();
    MaBDS.DataSource=MaDataTable;
    dgv.DataSource=MaBDS;
    Qu'est ce que le cas 2 apporte en plus sinon 2 lignes de code en plus, un objet complementaire a gerer par le FW, et peut etre la satisfaction académique d'avoir ajouté une abstraction

    Mais mon sentiment c'est qu'a force d'abstraction pour le plaisir on finit pas avoir du mal a retrouver ses jeunes !

  7. #7
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    C'est parce que tu considères que l'abstraction consiste à ajouter des couches entre les objets. Alors qu'il s'agit simplement de minimiser les liens forts entre les applications ou les composants d'une application.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  8. #8
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Et quand tu voudras ajouter dans une textbox par exemple l'id de l'élément couramment sélectionnée, tu vas te pluguer à des tas d'events de la grille à la main pour rafraîchir ton textbox, alors qu'un petit coup de binding sur un même bindingsource suffit.

  9. #9
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Merci Guulh

    Justement !!

    Tu viens d'entamer la reponse a un autre sujet que j'ai posté et pour lequel personne n'a encore répondu depuis deux jours

    Reflexion Combo + textbox

  10. #10
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Salut Guulh

    Il y a quand meme un truc que je ne capte pas bien dans ce que tu dis

    Et quand tu voudras ajouter dans une textbox par exemple l'id de l'élément couramment sélectionnée, tu vas te pluguer à des tas d'events de la grille à la main pour rafraîchir ton textbox, alors qu'un petit coup de binding sur un même bindingsource suffit.
    Avec un DGV je ferais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TextBox.text=DGV.CurrentRow.Cells["MaCell"].Tostring();
    Et ca effectivement dans un event rowchange ou rowenter (je sais plus lequel)

    En quoi ca change avec un BindingSource ?

  11. #11
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Tu peux faire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    bs.DatSource = taListeMetier; // ou ta taDataTable, ou ...
    grille.DataSource = bs;
    textBox.DataBindings.Add("Text", bs, "TaPropriété");
    Parce que la bindingsource a une propriété "Current", qui comme son nom l'indique indique l'objet courrament sélectionné (avec la garntie que Current est l'un des éléments de la Datasource du bs), et que les contrôles à binding simple (ie qui se binde à un objet unique et pas une collection, comme le textbox par exemple) se connectent en fait au Current d'un BindingSource.

    Le bs inclut entre autres un contexte, un currencyManager, ... qui permettent de n'utiliser une dgv que comme ce qu'elle est, c'est à dire un contrôle graphique.

    Bon là je parle dans l'idéal, y'a des limitations et je maitrise pas le sujet à 100%, mais tu vois l'idée

  12. #12
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Hello

    Avec ce que tu me montre là, je pense que j'ai déja 80% de la solution de ma datatable indexée sur un CMB permettant la visualisation d'une zone texte

    L'idée

    Je veux permettre a l'utilisateur de creer ses query dans la bd et sauver ceux les plus utiles en leur donnant un nom
    Je sauve tout ca dans une datatable

    Dans l'UI j'aurais

    Un CMB de recherche
    Un text BOX pour clef a ajouter ou modifier
    Un TextBox texte du query

    Les deux textbox bindé
    Un bouton ADD
    Et je supose que le bind gerera automatiquement les modifs ?

  13. #13
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Salut Guulh

    J'ai essayé ta seduisante suggestion d'usage d'un bindingsource
    J'ai peut etre pas encore compris qq chose
    Mais en tout cas pour le moment c'est pas encore aussi "magique" que tu le dis

    Voici ma tentative
    - Tout va bien, le combo est bien rempli et opérationnel
    - Pas d'erreur de compil ni d'execution
    - PAR CONTRE : mon txb_chauff est deseperement vide quoi que je fasse

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        private void fillCmbChauff()
        {
          Query qr = new Query();
          string sel = "select ChauffeurId,Naam from chauffeurs order by naam";
          DataTable dtChauf=qr.selectX(sel);
          bdsChauff.DataSource = dtChauf;
          cmb_Chauff.DataSource = bdsChauff;
          cmb_Chauff.DisplayMember = "naam";
          txb_chauff.DataBindings.Add("Text", bdsChauff, "ChauffeurId");
        }

  14. #14
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    OUUUUPS !!

    C'et moi qui avait fait une gaffe !!
    Je me suis trompé de textbox

    Ca marche super Guulh

  15. #15
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut BindingSource nécessaire ?
    Bonjour Guulh

    J'en reviens a mon sceptissisme sur l'usage d'un bindingsource

    A mon avis, ce n'est nécessaire
    QUE si la source concernée n'a pas l'Interface IBinding (les List<T> par exemple)
    OU si on veut binder plusieurs control de maniere indépendante sur la meme source

    Je viens d'essayer ceci (meme code que plus haut) SANS le bindingsource :

    Ca fonctionne tout aussi bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        // **************************************************************************************************
        private void fillCmbChauff()
        {
          Query qr = new Query();
          string sel = "select ChauffeurId,Naam from chauffeurs order by naam";
          DataTable dtChauf=qr.selectX(sel);
         // bdsChauff.DataSource = dtChauf;
          cmb_Chauff.DataSource = dtChauf; // bdsChauff;
          cmb_Chauff.DisplayMember = "naam";
          txb_numChauf.DataBindings.Add("Text", dtChauf, "ChauffeurId");
        }

  16. #16
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Oui, ca marche, mais comme je te le disais tout a l'heure, passer par un BS diminue l'interconnaissance entre ton code metier (qui se trouve etre du Ado.Net dans ce que tu montres, mais qui pourrait etre des listes d'objets metier trimballes par remoting, du xml, ... n'importe quoi qui implemente IList) et ton code graphique.
    Ce n'est pas une question de necessite ; c'est juste que ca facilite la maintenance du code.
    L'idee, c'est de rendre aussi independant que possible les donnees de leur presentation. Le BS fournit une interface (pas au sens interface C#, au sens intermediaire) simple et satisfaisant les besoins des des bindings simples et complexes.

  17. #17
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Merci Guulh

    Ouais !
    En tout cas pour le moment j'ai pas encore bien capté ce que ca pouvait apporter en plus ou en quoi ca peut faciliter certaines choses

    Mais peut etre que je tomberai dedans un jour et que j'aurai la révélation !

    1er Cas evident pour moi mais pas tres fréquent : binder des controles différent et indépendant sur la meme source

    2eme Cas : Binder une List<T> et non pas une datatable : j'ai du faire ca et je me suis rendu compte que le BindingSource limitait quand meme les opérations permise dans ma liste
    J'ai donc finit par deriver IBindingList dans ma Liste : resultat plus besoins de BindDingsource et je peux faire ce que je veux a partir de mon controle

    Mais j'attends encore la révélation qui me fera dire comme toi que le BindingSource est la meilleure solution !

  18. #18
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Citation Envoyé par olibara Voir le message
    J'ai donc finit par deriver IBindingList dans ma Liste : resultat plus besoins de BindDingsource et je peux faire ce que je veux a partir de mon controle
    Je te comprends pas Tu preferes implementer a la main une interface assez complexe, plutot qu'un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    BindingSource bs = new BindingSource();
    bs.DataSource = taListe;
    taGrille.DataSource = bs;
    dans le constructeur de ta form ? C'est super transparent un bindingsource...

    'fin j'insiste pas, comme tu dis tu verras a l'usage si t'en as besoin ou pas

  19. #19
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Salut

    Faire un BindingSource sur une List<T>

    Ne te permet pas pas le add ou delete, ou le sort (je ne sais plus bien)

    Maintenant, en reflechissant j'ai trouvé un cas ou le BindingSource peut s'averer utile :

    J'ouvre une nouvelle form generique qui permet d'afficher et d'mprimer un DGV
    A cette form, je passe une source pour mon DGV

    Soit je dois overloader des methode ou les constructeurs pour passer differents type de datasource
    Soit je passe un BinDingSource !

    Me trompe-je ?

  20. #20
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Bonsoir

    Je reviens sur cette intéressante discussion car je viens d'etre confronté au cas d'etre obligé de passer par un bindingsource je dirais meme DEUX bindingsource

    Situation

    Je dispose d'une source qui est un string[]

    J'e veux charger deux combo distinct avec cette source
    La selection dans l'un doit etre indépendante de la selection dans l'autre

    Dans ce cas il est indispensable d'utiliser deux bindingsource distinct pour les deux combo, mais chacun des bds sera bindé sur la meme string[]

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 10/12/2010, 17h06
  2. Comment utiliser proprement le BindingSource.AddNew()
    Par Fikou-Sama dans le forum VB.NET
    Réponses: 2
    Dernier message: 11/08/2009, 23h01
  3. Comment utiliser BindingSource.AddNew?
    Par nem&sys dans le forum Accès aux données
    Réponses: 4
    Dernier message: 05/02/2007, 11h46
  4. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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