none
Problème avec BindingContext RRS feed

  • Discussion générale

  • Bonjour,

    Voici mon problème:

    lors de l'événement Load d'une WinForm, une requête s'exécute sur une table de jointure et dans la  WinForm s'affiche autant de FlowLayouPanel que de nombre de Rows que la requête renvoie.  Dans le  FlowLayouPanel, il y une ComboBox.

    Voici le code de la méthode de création  du FlowLayoutPanel

    private FlpBandeauMedecin CreerBandeauSeul( )
    {
    FlpBandeauMedecin bm = new FlpBandeauMedecin();
    bm.Location = new Point(5, 10);
    bm.BtnPlus.Click += BtnPlusClick;
    bm.BtnMoins.Click += BtnMoinsClick;
    bm.BtnMoins.Focus();
    bm.ChkMedReferent.CheckStateChanged += CbChecked;
    vueMedecin = new DataView(tblMedecin);
    bm.CbMedecin.DataSource = vueMedecin;
    bm.CbMedecin.DisplayMember = "IDENTITE";
    bm.CbMedecin.ValueMember = "CLE";
    flpMedecin.Controls.Add(bm);
    return bm;
    }


    La ComboBox  est liée à la même source de donnée.

    Après la création j'appelle une méthode LierCombox(int nb) , toujours dans l'événement Load pour lier le résultat de la requete avec le ComboBox dont voici le code.

    private void LierComboBox(int nb)        
    {            
         for (int i = 0; i < nb; i++)
         {              
         foreach (Control ctrl in flpMedecin.Controls [i].Controls)               
            {                    
            if (ctrl is ComboBox)                   
             {  
    
             ComboBox cb = (ComboBox)ctrl; 
             BindingContext bc = new BndingContext ();                  
             cb.BindingContext = bc;
             CurrencyManager cm; 
             cm = (CurrencyManager)BindingContext        
             cm.Position =i; 
             cb.DataBindings.Add("SelectedValue", tblTjMedecinPatient, "clemed");
              }      
             }          
        }      
    }

    Je voudrais donc que chaque ComboBox affiche une donnée différent en fonction de i c'est à dire de la position dans la requete mais ca ne marche pas..

    Excuserz moi pour le premier code affiché mais j'avais pas vu le bouton de prévisualisation.

    toute aide ou idée sera la bienvenue.

    Xavier

    après avoir beaucoup lu la documentation microsoft et des bouquins, je cree en meme temps que le FlowlayoutPanel un nouveau BindingContext

    et j'ai modifié le code de la méthode LiercomboBox() comme suit mais toujours rien

    if (ctrl is ComboBox)  
    {                        
        ComboBox cb = (ComboBox)ctrl;   
        cb.DataBindings.Add("SelectedValue", tblTjMedecinPatient, "clemed");   
        CurrencyManager cm = (CurrencyManager)cb.BindingContext[tblTjMedecinPatient];
        cm.Position = i;  
    }



    dimanche 5 août 2012 08:16

Toutes les réponses

  • Bonjour,

    Je voudrais donc que chaque ComboBox affiche une donnée différent en fonction de i c'est à dire de la position dans la requete mais ca ne marche pas..
    C'est à dire ??? Il y a une exception ?

    Avez-vous la possibilité de nous envoyer un exemple de projet qui reproduirait le problème ?

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    dimanche 5 août 2012 20:59
    Modérateur
  • Bonjour,

    merci de votre intérêt et d'avoir reformaté mon premier exemple de code.

    Non,  aucune exception n'est levée. Dans mon premier exemple de code (création d'un BindingContext par la méthode LierComboBox(), le CurrencyManager "fonctionnait" un peu car en remplaçant la variable i par une valeur le nom qui s"affichait dans le ComboBox changeait mais bizarrement une valeur supérieure au nombre de Rows renvoyait par la requête ne levait aucune exception....  alors que le nombre de Rows en mode Debug est exact.

    C'est après voir lu la doc , que j'ai décidé de créer le BindingContext dans le container du ComboBox . Le  BindingContext est efficace car en  le DataSouce par  la table et non une vue, les données du  ComboBox  sont vraiment indépendantes par contre dans la deuxiéme version de la méthode  LierComboBox(), le changement de la variable par une valeur ne modifier en rien l'affichage dans le ComboBox.

    Quels seraient les morceaux de code que je peux vous envoyer pour m'aider à résoudre ce problème ? 

    Encore merci de votre aide

    Xavier

    P.S  t mais bizarrement une valeur supérieure au nombre de Rows renvoyait par la requête ne levait aucune exception....  alors que le nombre de Rows en mode Debug est exact : j'imagine que c'est de là que vient le problème.

     


    lundi 6 août 2012 05:20
  • Bonjour,

    Quels seraient les morceaux de code que je peux vous envoyer pour m'aider à résoudre ce problème ?
    Essayez de passer 10-15 minutes pour nous créer un petit projet exemple qui reproduit le problème. Stockez le dans un site de partage de fichier en ligne (par exemple SkyDrive) et donnez le lien du fichier partagé.

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    lundi 6 août 2012 22:19
    Modérateur
  • Bonjour,

    Je suis nouveau sur ce forum. Je maitrise mal les outils de ce forum....

    J'ai effacé ma dernière réponse par erreur. J'avais fait un petit projet qui montrait que  la logique de programmation est bonne. en fait le problème est simplement un problème de déclenchement d'évènement...

    Mon essai a été fait sur une WinForm et je me suis rendu compte que ce cela ne marchait plus si je mettais mon FlowlayoutPanel sur un Tabpage d'un TabControl qui n'était pas visible lors de l''affichage de la fiche la méthode ne marchait et si la TabPage était visible lors de l'affichage de la fiche en modifiant la propriété TabIndex la liaison se fait.....

    J'ai essayé plusieurs événement mais aucun ne marche.....

    Pourriez vous me conseiller car je maitrise encore mal la gestion des événements...

    Cordialement

    Xavier Compagnion

    mercredi 8 août 2012 17:31
  • Bonjour,

    Tabpage d'un TabControl qui n'était pas visible lors de l''affichage de la fiche la méthode ne marchait et si la TabPage était visible lors de l'affichage de la fiche en modifiant la propriété TabIndex la liaison se fait.....
    C'est le comportement normal du TabControl. Pour des raisons de performance, le DataBinding ne se fait que sur les TabPage qui sont affichées la première fois.

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    mercredi 8 août 2012 23:11
    Modérateur
  • Boujour,

    pas de solution au problème alors ? on ne peut pas faire du DataBinding "utilisant un Bindingcontext et CurrencyManager sur un ComboBox avec création de composant  en runtime sur un TabPage dont le TabIndex est > 0 ?

    quand je met un Button le déclenchement de l'événement Click provoque la liaison. Alors jeme demande si on peut provoquer le déclenchement OnClick dans la méthode dans l'évènement Show de la fiche.......

    J'imagine que je dois passer par la métode OnClick()...

    Je vais devoir passer par un DataGridView ??? mais le problème ne sera t'il pas le meme avec un DataGridViewComboBoxColumn ? Ou je dois définitivement oublier le combobox ?

    J'ai une autre fiche ou sur un TabPage d'index > 0 des CheckBox sont créés en run time avec des liaisons simples qui se font sans problème... 

    Cordialement



    jeudi 9 août 2012 05:40
  • Bonjour,

    Pourquoi le fait que le DataBinding ne soit pas activé au niveau des onglets inactivé par l'utilisateur vous pose problème ?
    Pouvez-vous montrer une capture de ce que vous rechercher à faire exactement ?

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    jeudi 9 août 2012 22:44
    Modérateur
  • Bonjour,

    voilà ce que j'ai quand je clique sur l'onglet Médecin de la fiche (Index= 4)

    Aspect du TabPage

    Je dois cliquer sur le bouton pour que les liaisons s'exécutent.

    Voilà sur quoi je bute depuis plusieurs jours et je vois pas quel événement pour gérer ça car bien entendu il ne doit se déclencher qu'une seule fois.

    Encore merci pour votre aide.

    Cordialement

    vendredi 10 août 2012 13:21
  • Bonjour

    Une solution reste toujours de vérifier dans l’évènement  Enter de votre TabPage et exécutez le même code que vous exécutez dans le Boutton.

    Cordialemernt,


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    vendredi 21 septembre 2012 09:01
  • Merci Aurel,

    Je vais essayer ta solution. Je n'ai pas rien fait depuis longtemps sur ce formulaire. Mais j'avais lu sur le forum des remarques concernant les événements de la TabPage pouvant expliquer pourquoi ce ne marchait pas. 

    Cordialement

    dimanche 23 septembre 2012 18:01
  • Bonjour,

    Est-ce que vous avez testé les solutions proposées ? Merci de partager avec nous les résultats, afin que d'autres personnes avec le même problème puissent profiter de cette solution.

    Cordialement,

    Aurel


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    jeudi 27 septembre 2012 08:15
  • Bonjour,

    Nous changeons le type de votre question à « Discussion générale » parce que vous n’êtes pas revenu avec les informations sollicitées. Si vous avez plus de temps pour réexaminer la question et fournir plus d'informations, n'hésitez pas à modifier le type du thread à « Question ». Si le problème est résolu, s’il vous plaît partagez la solution avec nous afin que la réponse puisse être trouvée et utilisée par d'autres membres de la communauté ayant des questions similaires.

    Merci !

    Cordialement,

    Aurel


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    vendredi 28 septembre 2012 09:36