Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[C#] DataMember in databinding rebind niet

Pagina: 1
Acties:

Verwijderd

Topicstarter
Beste mensen,

Stel, ik heb de volgende situatie: ik voeg een databinding control toe aan een form in .Net en ik geef daaraan mee dat het object datasource van het type 'Inkooporder' is, en ik geef aan dat de DataMember 'Crediteur' is. Deze bind ik aan een aantal labels in mijn form. Vervolgens maak ik in code een nieuwe inkooporder aan en stop die in de datasource van het bindingcontrol.

C#:
1
2
3
Inkooporder order = new Inkooporder();
order.Crediteur = new Crediteur("Testcrediteur");
crediteurBindingSource.DataSource = order;


Het object inkooporder implementeerd INotifyPropertyChanged. Echter, als ik nu de volgende code uitvoer:

C#:
1
order.Crediteur = new Crediteur("Blabla crediteur");


Veranderen de labels niet. Hoe kan dat en hoe kan ik er voor zorgen dat dit wel gebeurt? Als ik een bindingsource rechtstreeks bind zonder DataMember te gebruiken, werkt het prima!

Alvast bedankt!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Stel?? Heb je dit probleem nou wel of niet? Ik doe niet aan hypothetische problemen. Betreft het een windows of web applicatie? INotifyPropertyChanged vuurt alleen een event af wanneer een property wijzigd. Databind controls abonneren zich niet op het PropertyChaging en PropertyChanged event.

Verder denk ik dat het verstandig gezien je vraag stelling dat je even goed de informatie over data binding (DataBindings property en het gebruik van de BindingContext) in de MSDN gaat lezen.

If it isn't broken, fix it until it is..


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23:37

TeeDee

CQB 241

Je weet zeker dat het event opgegooid wordt?

Heart..pumps blood.Has nothing to do with emotion! Bored


Verwijderd

Topicstarter
Niemand_Anders schreef op vrijdag 29 februari 2008 @ 10:48:
Stel?? Heb je dit probleem nou wel of niet? Ik doe niet aan hypothetische problemen. Betreft het een windows of web applicatie? INotifyPropertyChanged vuurt alleen een event af wanneer een property wijzigd. Databind controls abonneren zich niet op het PropertyChaging en PropertyChanged event.
Ja, dit probleem heb ik uiteraard, anders zou ik de vraag niet stellen. Het betreft een windows app. Door INotifyPropertyChanged te implementeren en bij het wijzigen van een property het PropertyChanged event aan te roepen, rebinden de controls zich die aan de bewuste property zijn gebonden toch?
TeeDee schreef op vrijdag 29 februari 2008 @ 10:52:
Je weet zeker dat het event opgegooid wordt?
Ja, als ik een break point invoeg, wordt het event keurig aangeroepen. De datasource van het databindingobject is ook correct aangepast, het lijkt wel alsof het alleen niet doorgegeven wordt richting de interface.

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

TeeDee schreef op vrijdag 29 februari 2008 @ 10:52:
Je weet zeker dat het event opgegooid wordt?
Textbox, CheckBox, ComboBox, etc doen niets met de events van de INotifyPropertyChang(ing/ed) interfaces. Draai de vraag een om, waarom zou een Textbox zich abonneren op een event van een extern object? Als Microsoft daarmee begint is het einde zoek.
Maar als de TS even de MSDN (goed) leest, dan vind hij daar het antwoord op zijn vraag en zelfs een voorbeeld. De oplossing staat zowel beschreven in de 2005- en 2008 MSDN documentaties.

Tip: Kijk naar het BindingSource object.

If it isn't broken, fix it until it is..


Verwijderd

Topicstarter
Niemand_Anders schreef op vrijdag 29 februari 2008 @ 11:09:
[...]

Textbox, CheckBox, ComboBox, etc doen niets met de events van de INotifyPropertyChang(ing/ed) interfaces. Draai de vraag een om, waarom zou een Textbox zich abonneren op een event van een extern object? Als Microsoft daarmee begint is het einde zoek.
Maar als de TS even de MSDN (goed) leest, dan vind hij daar het antwoord op zijn vraag en zelfs een voorbeeld. De oplossing staat zowel beschreven in de 2005- en 2008 MSDN documentaties.

Tip: Kijk naar het BindingSource object.
Misschien is mijn omschrijving van het probleem wat verwarrend. Ik lees in de msdn libary niets anders als wat ik al doe. Ik gebruik dus al een BindingSource object. Voor BindingSource.DataSource geef ik Inkooporder op en als BindingSource.DataMember geef ik Crediteur. Dat werkt ook gewoon, behalve als de crediteur in de inkooporder wordt gewijzigd, dan blijft de oude waarde zichtbaar i.p.v. de nieuwe. Doordat ik een bindingSource object gebruik, hoort het control middels de bindingSource zich toch gewoon te aboneren op het PropertyChanged event?

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-11 18:33
Het lijkt mij dat de BindingSource alleen events van het object dat je er in stopt krijgt, en niet events van objecten die in dat object zitten.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Verwijderd schreef op vrijdag 29 februari 2008 @ 11:27:
[...]

Misschien is mijn omschrijving van het probleem wat verwarrend. Ik lees in de msdn libary niets anders als wat ik al doe. Ik gebruik dus al een BindingSource object. Voor BindingSource.DataSource geef ik Inkooporder op en als BindingSource.DataMember geef ik Crediteur. Dat werkt ook gewoon, behalve als de crediteur in de inkooporder wordt gewijzigd, dan blijft de oude waarde zichtbaar i.p.v. de nieuwe. Doordat ik een bindingSource object gebruik, hoort het control middels de bindingSource zich toch gewoon te aboneren op het PropertyChanged event?
Misschien is het verstandig dat je toch wat meer code post, want DataMember van de BindingSource behoort helemaal niet gezet te worden. De BindingSource wordt gebruikt bij bijvoorbeeld
C#:
1
2
3
4
5
BindingSource bindingSource = new BindingSource();
bindingSource.DataSource = order;
orderAmount.DataBindings.Add(new Binding("Text", bindingSource, "OrderTotaal", false));
crediteurName.DataBindings.Add(new Binding("Text", bindingSource, "Crediteur.Naam", false));
crediteurRekNr.DataBindings.Add(new Binding("Text", bindingSource, "Crediteur.RekeningNummer", false));


DataMember is eigenlijk een soort filter. Je zegt dan eigenlijk dat order.Crediteur in de gaten moet worden gehouden en daarmee impliciet dat Crediteur INotifyPropertyChanged implementeert. Omdat order.Crediteur deze interface niet implementeert zal op het moment dat je een andere crediteur toewijst ook de inhoud van de textbox worden veranderd. InkoopOrder is degene welke de interface implementeert, dus mag aan BindingSource geen limitatie worden opgelegd. BindingSource is degene welke het event afvangt en de bijhorende textbox update.

If it isn't broken, fix it until it is..


  • Ruudjah
  • Registratie: November 1999
  • Laatst online: 06-09 20:58

Ruudjah

2022

DIT BERICHT IS PREVENTIEF VERWIJDERD DOOR DE GEBRUIKER

[ Voor 98% gewijzigd door Ruudjah op 01-12-2009 22:34 ]

TweakBlog

Pagina: 1