DataBindings + rafraichissement des données d'un TextBox - C#/.NET managed - Programmation
Marsh Posté le 09-09-2006 à 12:04:35
il existe une méthode "ResetCurrentItem" sur le bindingSource qui permet de rafraichir tous les composants graphiques. Chaque composants rafraichira donc ça donnée... Voila... J'espère que ça ira.
PS: je crois que c'est valable uniquement avec .NET 2.0 sinon faut passer par un bindingManagerBase
Marsh Posté le 11-09-2006 à 15:22:38
Salut,
je viens d'essayer d'utiliser la méthode ResetCurrentItem en insérant un bindingSource mais le rafraichissement ne se fait toujours pas.
As-tu un exemple d'utilisation d'un control bindingsource, je n'ai pas trouvé de tuto suffisament explicite ?
Dans la msdn, cette méthode correspond à ce que je souhaite faire. J'ai trouvé un équivalent avec CurrencyManager appelé depuis le bindingcontext d'un composant mais ca ne marche pas non plus.
En plus un effet bizare apparait, certains textbox et label ne pointent plus correctement dans la dataset ; ils affichent la premiere ligne au lieu de celle demandée dans le code.
Ceci disparait lorsque je mets en commentaire la demande de rafraichissement via un currencymanager.
Marsh Posté le 11-09-2006 à 21:33:57
gwenCPP a écrit : Salut, |
bon bon...
Soit un bindingSource nommé "bindingSourceTest"
dans le designer de la fenêtre tu click sur propriété du bindingSource. Dans le dataSource, tu lui donnes le type d'objet que tu veux mettre dans le bindingSource (une liste d'objet par exemple).
cette étape n'est pas indispensable.
Ensuite comme tu récupères apparemment un dataset tu fais ceci dans ton code
bindingSourceText.DataSource = monDataSet (éventuellement préciser la datatable).
maintenant au niveau du designer de la fenêtre, tu click droit sur un composant qui doit être bindé avec la valeur. pour cela, tu vas dans la propriété DATABINDINGS du composants (textbox, combo, etc.) et à "value", tu sélectionne dans la liste tout d'abord ta bindingSource, et dans ses détails le champs sur lequel tu veux bindé le composants.
par exemple:
pour un textbox qui acceuillera le nom d'une personne, tu bindera sa propriété VALUES sur le champ NOM du bindingSource. Rappele toi que le bindingSource reflete simplement les infos de ton dataset.
Attention, si tu veux que ça fonctionne correctement, je te conseil d'effectuer la première étape. Pour bien faire, il faudrait créer un XSD qui contiendra la structure de ton dataset afin de pouvoir via le designer initialisé les composants graphiques sur la structure du dataset. Ceci te permettra donc de faire cela facilement sans écrire une ligne de code...
Voila j'espère que c'est compréhensible. C'est pas facile à expliquer. C'est plus facile à montrer
Marsh Posté le 12-09-2006 à 09:25:02
Merci, l'explication est très claire
j'avais réalisé une partie de la manip correctement, je vais essayé de lui donner un type.
Pour les liaisons, je dois passer par du code car je charge mon dataset via une feuille .csv. Conclusion, lors du démarrage de l'application le dataset ne contient pas de table et je ne peux pas passer par l'interface pour faire les liaisons. A mon avis se sera pareil pour le bindingsource.
L'autre problème que j'avais avec le bindingsource était la dissociation des contextes pour chaque control mais les rafraichissements ne se faisaient pas.
XSD c'est de l'XML ? (désolé je me suis mis au C# par la force des choses, je suis originaire de l'embarqué et je ne connais pas tout encore).
Sinon après quelques manip hier soir j'ai vraiment l'impression que le problème viens du dataset passé en référence dans la fenêtre fille et la classe. Les envois de rafraichissement ne fonctionnerais pas à cause de ça parce que sinon ca marche correctement à l'intérieure de la fenêtre fille.
j'essaye une dernière fois et si ca ne marche toujours pas je change l'architecture de mon soft.
Merci pour ton aide
Marsh Posté le 12-09-2006 à 22:02:50
un XSD est un schéma XML qui permet de représenté les données.
sous VS 2005, tu peux en créer très facilement, et créer des table dedans (leurs définitions) tel que des tables en base de données.
Ensuite, cette définition peut etre associé au bindingSource. Lors de l'exécution, il suffira simplement de passer un dataset possédant une datatable correspondant à l'une définie dans le XSD. Le bindingSource initialisé sur une table X du XSD, pourra donc lors de l'exécution fournir l'ensemble des données au bindingSource et tu pourras donc les manipulé très facilement.
Si tu as encore des prob, n'hésite pas à poster ton code
Marsh Posté le 08-09-2006 à 15:42:34
Bonjour,
j'ai déjà vu un problème similaire sur le net mais je n'arrive plus à mettre la main dessus.
Voilà exactement ma situation :
J'ai une fenêtre principale dans laquelle je déclare et initialise un DataSet via un fichier csv. Je déclare également une fenêtre fille ouverte à l'aide de la méthode show() et une classe de traitement de données (gestion de trame du port série).
Ces deux classes sont initialisées par un constructeur qui prend par référence le DataSet de la fenêtre principale. Si je ne me trompe pas, les trois classes possèdent donc la même DataSet du point de vue mémoire.
Dans la classe de traitement de données, je modifie des valeurs dans ma Table du DataSet.
Dans la fenêtre fille, j'initialise mes composants avec la méthode DataBindings et je modifie le bindingcontext pour pointer sur la ligne désirée.
voici la fonction utilisée pour ça :
Je possède également un datagrid dans cette fenêtre pour voir l'état du DataSet.
Mon problème est le suivant : lorsque j'ouvre la fenêtre fille pour la première fois, les liaisons avec le dataset fonctionne très bien. Lorsque je veux modifier le DataSet pendant que la fenêtre fille est ouverte ou lorsque je la réouvre, tous les composants liés au DataSet ont gardés leur première valeur. Remarque : le datagrid contient les valeurs modifiées dans le DataSet.
Quelqu'un sait-il comment faire pour que les liaisons de mes composants soient refraichies correctement ?
Merci de votre aide,
Gwen