Problème avec BindingContext
-
dimanche 5 août 2012 08:16
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; }
- Modifié Xavier Compagnion dimanche 5 août 2012 12:03
- Modifié Gilles TOURREAUMVP, Moderator dimanche 5 août 2012 20:55 reformatage
- Type modifié Aurel BeraMicrosoft Contingent Staff, Owner vendredi 28 septembre 2012 09:36 Pas de reponse
Toutes les réponses
-
dimanche 5 août 2012 20:59Modérateur
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 -
lundi 6 août 2012 05:20
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.
- Modifié Xavier Compagnion lundi 6 août 2012 06:01
-
lundi 6 août 2012 22:19Modérateur
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 -
mercredi 8 août 2012 17:31
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 23:11Modérateur
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 -
jeudi 9 août 2012 05:40
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
- Modifié Xavier Compagnion jeudi 9 août 2012 05:51
- Modifié Xavier Compagnion jeudi 9 août 2012 15:09
-
jeudi 9 août 2012 22:44Modérateur
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 -
vendredi 10 août 2012 13:21
Bonjour,
voilà ce que j'ai quand je clique sur l'onglet Médecin de la fiche (Index= 4)
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 21 septembre 2012 09:01Propriétaire
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,
-
dimanche 23 septembre 2012 18: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
-
jeudi 27 septembre 2012 08:15Propriétaire
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
-
vendredi 28 septembre 2012 09:36Propriétaire
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

