Toon posts:

[C#] DataColumn Expression

Pagina: 1
Acties:

Verwijderd

Topicstarter
Op verschillende plaatsen in mijn winforms applicatie heb ik DataColumns met bepaalde Expressions toegevoegd aan DataTables. Via Parent / Child expressies kan ik dan waarden berekenen, opzoeken in andere DataTables etc ... Ook om bv. de volledige naam van een personeelslid te tonen in een combobox - terwijl ik enkel de voornaam en familienaam bijhoudt - maak ik gebruikt van een extra DataColumn. Probleem is dat als ik een nieuwe rij toevoeg aan de achterliggende DataTable, dat de Expression niet berekend wordt.

Concreet: in VS.NET heb ik een tesform gemaakt met 2 textboxen, 1 combobox en 1 button.

- declareer een variabele

code:
1
private DataTable personen;


- in de Form1_Load komt de volgende code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
personen = new DataTable("Personen");
DataColumn dc = new DataColumn("Voornaam");
personen.Columns.Add(dc);
dc = new DataColumn("Familienaam");
personen.Columns.Add(dc);
dc = new DataColumn("Naam");
dc.Expression = "Voornaam + ' ' + Familienaam";
personen.Columns.Add(dc);

DataRow dr = personen.NewRow();
dr["Voornaam"] = "Jan";
dr["Familienaam"] = "Peeters";
personen.Rows.Add(dr);

dr = personen.NewRow();
dr["Voornaam"] = "Pieter";
dr["Familienaam"] = "Janssens";
personen.Rows.Add(dr);

comboBox1.DataSource = personen;
comboBox1.DisplayMember = "Naam";


- op Button1_Click komt het volgende te staan

code:
1
2
3
4
DataRow dr = personen.NewRow();
dr["Voornaam"] = textBox1.Text;
dr["Familienaam"] = textBox2.Text;
personen.Rows.Add(dr);


Indien je nu op de button klikt, wordt een nieuw record aan de DataTable toegevoegd, de combobox is gebaseerd op dezelfde DataTable, dus daar verschijnt ook een extra record. Enige probleem is dat de opgegeven Expression niet verschijnt. (een leeg record verschijnt, klik ik nogmaals op de button, dan wordt het vorig toegevoegde record wel correct getoond) Gebruik ik een andere kolom, dan werkt alles wel naar behoren.

code:
1
comboBox1.DisplayMember = "Voornaam";


Enig idee wat er fout loopt? (Databinding property is voorlopig geen optie meer, project moet heel binnenkort binnen zijn :/)

Verwijderd

opnieuw databinden?
combobox1.databind()

[ Voor 37% gewijzigd door Verwijderd op 27-05-2003 19:50 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 10:17
Verwijderd schreef op 27 May 2003 @ 19:49:
opnieuw databinden?
combobox1.databind()
WinForms is heel iets anders dan WebForms.
In WebForms moet je idd altijd de databind() method oproepen als je data opnieuw moet binden.
In WinForms niet, daar gaat er automatisch gerefreshed (gebinded) worden als je iets aan de datasource property v/e control toekent.

https://fgheysels.github.io/


Verwijderd

Topicstarter
In winforms bestaat er bij mijn weten geen databind().

Wat ik evt wel kan doen is de datasource op null zetten, en dan terug de datasource op personeelsleden zetten, alsook displaymember opnieuw plaatsen.

Het bovenstaand voorbeeld is heel simpel voorgesteld, in het huidig project moet ik dan enkele tientallen combo's zelf opnieuw opbouwen van zodra ook maar één veldje verandert :( Raar dat het perfect/automatisch werkt met gewone DataColumns en niet met een DataColumn die een Expression heeft.

Dit probleem heb ik enkel bij het toevoegen van nieuwe records. Bestaande records wijzigen lukt wel, m.a.w.: wijzig ik een bestaand record, dan wordt de naam (uit de extra DataColumn) wel mee geupdated in de combobox.

  • EfBe
  • Registratie: Januari 2000
  • Niet online
In de debugger heeft het veld wel de juiste waarde? M.a.w.: de column die je hebt toegevoegd, heeft die de verwachte waarde voor dat nieuwe record?

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Verwijderd

Het veld met de "Naam" heeft de juiste waarde. In mijn applicatie is het wel iets gecompliceerder. Op één form kan je personeelsleden aanmaken, op een ander form kan je deze personeelsleden toewijzen aan een bepaalde verkoop. Maak ik een nieuw personeelslid aan in het ene form, dan wou ik ervoor zorgen dat dit nieuw personeelslid ook verscheen in de combobox van personeelsleden op het venster van verkopen. Dit heb ik gedaan door alle controls aan dezelfde dataset te koppelen. Alles zou dan normaal automatisch moeten worden geupdated, maar blijkbaar werkt dit niet even goed in bepaalde gevallen.

- Beide forms staan naast elkaar open, ik wijzig een bestaand personeelslid, het berekend naam veld wordt in de combo op het andere venster geupdated. no problem.
- Beide forms staan naast elkaar open, ik voeg een nieuw personeelslid toe, in de combobox komt een lege entry te staan, terwijl in de achterliggende datatable wel degelijk de juiste data zit
- Form 1 van personeelsleden staat open, ik voeg een nieuw personeelslid toe, dan open ik form 2 met verkopen, de juiste naam verschijnt, maar bij het selecteren ontstaat een "object reference not set to an instance of an object" error.

Mocht ik van het geposte voorbeeldje een werkende versie kunnen maken, kan ik die principes overpakken, maar tot nut toe heb ik nog geen passende oplossing gevonden. (de AcceptChanges() method werkte daarentegen wel, maar dan crasht de rest van het programma terug eens ik een record wil wijzigen)
Pagina: 1