La mise à jour de BindingSource dans WinForms ne met pas à jour la collection de sources de données
Je veux afficher une collection personnalisée dans un DataGridView
dans une application Windows Forms. Cette coutume de la collection met en œuvre ICollection
et IEnumerable
. J'ai mis en place un BindingSource
à l'aide de la collection .Propriété DataSource. Le DataGridView
est configuré pour utiliser mon BindingSource
que c'est de la source de données. Quand j'ajoute un nouvel élément à la collection à l'aide de la BindingSource.Add()
méthode, la DataGridView
les mises à jour correctement avec le nouvel élément. Le BindingSource
source de données, d'autre part, ne pas:
MyCustomCollection myCollection = new MyCustomCollection();
myCollection.Add(myCustomObject1);
myCollection.Add(myCustomObject2);
myBindingSource.DataSource(myCollection);
myBindingSource.Add(myCustomObject3);
Dans le code ci-dessus, myBindingSource interne de la Liste contient le nombre d'enregistrements (3), et le DataGridView
contient également trois enregistrements, mais myCollection ne contient que deux enregistrements. Je sais que la modification de la sous-jacentes myCollection ne sera PAS de mise à jour de la BindingSource
ou la DataGridView
comme il n'est pas un BindingList<T>
mais j'étais sous l'impression que la mise à jour d'un BindingSource
directement permettrait de s'assurer que myCollection a été mis à jour à la même heure.
Est-il un moyen d'utiliser une collection qui n'est pas un BindingList<T>
et l'ont mis à jour lors de l'interaction avec le BindingSource
directement?
Mise à jour: Une façon que j'ai obtenu les données à jour sur toutes les pièces de la Collection, BindingSource, DataGridView) est comme suit:
myCollection.Add(myCustomObject3);
myBindingSource.DataSource = null;
myBindingSource.DataSource = myCollection;
Je suis assez sûr qu'il y a une meilleure façon de s'attaquer à ce problème, mais c'est la seule méthode qui produit les résultats que j'attendais.
source d'informationauteur Jeff Clare
Vous devez vous connecter pour publier un commentaire.
Le problème est de Remplir Adaptateur. Lorsque vous chargez votre forme, la Remplir est fait pour vous.
Assurez-vous de vous faire une Recharge et puis un suivi avec remise des liaisons post toutes les modifications de données et réseau va se rafraîchir.
Exemple :
Vous devrez manuellement appel ResetBindings() après les modifications de source de données si vous utilisez un récipient qui ne peuvent pas le faire à votre place.
http://msdn.microsoft.com/en-us/library/system.windows.forms.bindingsource.resetbindings.aspx
Réinitialisation d'un élément individuel fonctionne!
J'ai pas eu de chance avec .ResetBindings(faux) et re-affectation de la datsource causé scintillement avec potentiail surcharge si un seul élément de changer fréquemment.
J'ai essayé de l'intégré dans le mécanisme à l'aide de PropertyChanged mais rien mise à jour.
Mettre à zéro un élément à l'aide de ResetItem() a fonctionné!
Et même mieux - si vous avez un événement de mise à jour attaché à chaque élément de données dans la bindningsource vous pouvez localiser l'objet dans l'bindning source et l'utilisation de l'index de l'objet de l'appel ResetItem(idx)
Dans ce cas, mon événement personnalisé args contient une clé de dictionnaire à l'objet de données contenues dans une collection à part. Après se trouve l'objet à l'aide de bindningsource.IndexOf (), il est individuellement actualisé.
Je crois que je suis tombé sur cette question tout à l'heure - j'ai fait une recherche dans les fichiers sur mon code et je pense que c'est la solution qui a fonctionné pour moi.
C'était dans le contexte d'un gestionnaire d'événements click pour le bouton enregistrer.