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 :

[MDI]Cmt partager, entre + Form, un DataSource sans partager sa position courante ?


Sujet :

Windows Forms

  1. #1
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut [MDI]Cmt partager, entre + Form, un DataSource sans partager sa position courante ?
    Salut,
    je rencontre un pb avec le databinding au sein d'une application MDI.
    Les fenêtres MDI proviennent d'un héritage de form. La form de base contient un groupbox hébergeant différent contrôles de saisie.
    L'objectif est de partager un ArrayList entre un combobox présent sur certaines fenêtres MDI dérivées.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    private void FrmProduit_Load(object sender, EventArgs e)
    {
        Debug.Assert(this.FormParente.CollectionFournisseur != null);
        cbxNumfournisseur.DataSource = this.FormParente.CollectionFournisseur; //ArrayList
        cbxNumfournisseur.DisplayMember = "NumFournisseur";
        ...
    J'aimerais avoir un déplacement autonome dans l'ArrayList et ce pour chaque fenêtre MDI l'utilisant, i.e. sans répercuter la position courante dans chaque contrôle liés.
    Le fait de placer le datasource à null dans la form principale ne régle pas le pb :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public void DesactiveDataBindingForm<T>(FrmBase FormCourante) where T : FrmBase
    {
        foreach (FrmBase Frm in this.MdiChildren)
        {
            if (Frm is T)
            {
                //On  annule le databinding des autres fenêtres de même type
                if (Frm != FormCourante)
                    Frm.CollectionCourante = null;
            }
        }
    }
    Après 6 heures de test et de recherche diverses si qq un a une idée sur une solution, je suis preneur.
    Merci.

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    On en avait déjà parlé ici :
    http://www.developpez.net/forums/sho...d.php?t=432595

    Il semble que lorsque plusieurs contrôles de type "liste" (et donc avec une propriété du type "SelectedItem") partagent la même DataSource, l'objet courant est le même pour tous. La solution en .Net 2 est de passer par un BindingSource intermédiaire ; je ne sais pas comment faire en .Net 1.
    ಠ_ಠ

  3. #3
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Salut,
    merci pour ta réponse
    Citation Envoyé par Guulh
    On en avait déjà parlé ici :
    Il va sans dire que j'ai recherché sur les forums mais avec les mots clés choisis j'ai dû passer au travers.
    Citation Envoyé par Guulh
    Il semble que lorsque plusieurs contrôles de type "liste" (et donc avec une propriété du type "SelectedItem") partagent la même DataSource, l'objet courant est le même pour tous.
    Oui je suis d'accord mais on peut vouloir partager les données sans pour autant partager le comportement. Mais il se peut, au vue de mes faibles connaissances du Framework, que dans ce cas que là le databinding ne soit pas approprié. J'ai cru comprendre que l'objet DataView permettait le comportement que je recherche mais au prix d'une duplication des données, je n'ai pas eu le temps de vérifier...
    N'étant pas encore à l'aise avec les events et la mécanique du databinding, je me demandais comment désactiver momentanément ce comportement.
    Citation Envoyé par Guulh
    La solution en .Net 2 est de passer par un BindingSource intermédiaire.
    Peux-tu m'en dire plus ? Au moins vers quel objet ou terme technique du Framework .NET orienté mes recherches.

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Je veux bien t'en dire plus, mais la gestion du "SelectedItem" reste assez opaque pour moi aussi

    Par contre, pour le BindingSource : c'est un intermédiaire, que tu places entre ta vrai source et ton contrôle, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    List<Machin> maSource = new List<Machin>(); // ou n'importe quel IList ou IList<T>
    BindingSource bs = new BindingSource();
    DataGridView dgv = new DataGridView(); // ou n'importe quel contrôle attendant un IList en DataSource
    bs.DataSource = maSource;
    dgv.DataSource = bs;
    Et là, tu peux lier ta liste source à autre chose (via encore un autre BindingSource) sans "synchronisation" non souhaitée.

    Tu parles de DataView, et c'est là la clé : il y a en gros deux façons d'afficher des données dans une grille, soit en passant par ADO.Net (DataTable, dataView, etc.), soit par des List / BindingList / Mieux. Parce que la DataGridView offre le plus de fonctionnalités lorsque sa source implémente IBindingListView et que cette interface n'est implémentée que par DataTable et DataView (ou presque) dans le framework, il manque cruellement un objet servant de "vue" sur une autre liste, permettant tri et filtre.
    ಠ_ಠ

  5. #5
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Salut,
    Citation Envoyé par Guulh
    Et là, tu peux lier ta liste source à autre chose (via encore un autre BindingSource) sans "synchronisation" non souhaitée.
    C'est parfait !
    Citation Envoyé par Guulh
    Tu parles de DataView et c'est là la clé
    Il me faut creuser le sujet, pour le moment je n'ai pas le temps d'aborder les détails.

    Je te remercie pour ton aide, aujourd'hui j'ai appris qq chose

  6. #6
    Membre éclairé
    Avatar de shwin
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    568
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2003
    Messages : 568
    Points : 777
    Points
    777
    Par défaut
    Le probleme se situe au niveau du CurrencyManager, tes composants utilise tous le meme. Je sais pas trop comment le réglé avec les composant .net car moi j'utilise seulement ceux d'infragistic et il y a une merveilleuse propriété SyncWithCurrencyManager qui suffit de mettre a false pour que le composant utilise son propre CurrencyManager
    Remoting Context Matters
    Everything in this chapter is 100 percent undocumented. Reliance on these techniques is not supported by either Microsoft, the publisher, or the author of this book. Use at you own risk! If your computer won't work afterwards, your toaster blows up or your car doesn't start, I assume no liability whatsoever: You're now about to enter the uncharted territories of .NET and you do so on your own risk. I can only provide some guidance

  7. #7
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par shwin
    Le probleme se situe au niveau du CurrencyManager, tes composants utilise tous le meme.
    Peut être, je dois étudier ça.

    Pour commencer j'ai trouvé ceci sur MSDN :
    http://www.microsoft.com/downloads/d...displaylang=fr

    et sur CodeProject ce tutoriel, déjà cité par un modérateur :
    Data binding concepts in .NET windows forms
    Sur ce dernier site il existe de nombreux tutoriaux sur le sujet, de mon coté je dois juste trouver du temps pour les consulter...

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

Discussions similaires

  1. Session de connexion partage entre PHP-Forms dans Oracle
    Par DoomTheFlame dans le forum Forms
    Réponses: 4
    Dernier message: 06/10/2010, 18h20
  2. vb.net : Partage des variables entre forms
    Par House MD dans le forum VB.NET
    Réponses: 5
    Dernier message: 13/03/2008, 22h46
  3. récuperer un champ texte sans le mettre entre <form> et </form>
    Par seb-oulba dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 06/09/2006, 16h41

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