[.NET] Databinding en typed DataSet 'extensions'

Pagina: 1
Acties:

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:16
Ik heb een probleempje met m'n WinForms applicatie:

In m'n applicatie maak ik gebruik van databinding om de gegevens die zich in een typed dataset bevinden op het scherm te tonen en vice versa.

Nu heb ik in die typed dataset een aantal velden die nullable zijn. Bepaalde van die velden toon ik in een combobox.
Als zo'n veld null is, dan mag er in de combobox niets geselecteerd zijn. Daarom heb ik bv. in m'n XSD voor dat veld volgend attribuut geplaatst:

code:
1
codegen:nullValue=-1


Dit zorgt er dus voor dat, als dat veld DBNull.Value bevat, ik -1 terugkrijg. Op die manier kan ik makkelijker databinden.

Tot voor kort werkte dit echter allemaal perfect, als ik checkte op dat veld of het null bevatte (dmv IsxxxxNul() method), kreeg ik ook NULL terug als dit het geval was.
Echter, ik heb nu voor het saven deze regel code erbij geplaatst:
code:
1
this.BindingContext[myDataSet].EndCurrentEdit();


Deze regel heb ik nodig omdat ik er zeker van wil zijn dat alle wijzigen zich in de dataset bevinden (dit was nl. niet altijd het geval).
Echter, wat gebeurt er nu: als ik Save, dan krijg ik een foreign key constraint violation.
Wat blijkt nu: m'n IsxxxxNull() check werkt niet meer naar behoren; ipv dat ik 'true' terugkrijg, krijg ik false terug, en bijgevolg wil m'n data access component nu -1 inserten in dat veld.

Kan iemand mij verklaren waarom die codegen:nullValue blijkbaar de mist in gaat als ik die EndCurrentEdit aanroep ?

https://fgheysels.github.io/


  • 6K
  • Registratie: September 2002
  • Laatst online: 19-01-2025

6K

is ook zo...

ik heb werkelijk waar geen idee, maar logischerwijs:
je geeft opdracht om null waardes te presenteren als -1.
Hij wijzigt op dat moment niets in de database, maar de dataset waarde gaat naar -1.
Op het moment dat je zegt EndCurrentEdit ga ik er van uit dat je het IEditableObject geimplementeerd hebt. Zoja, die gaat keihard saven AFAIK...
dus voor het saven moet je effe de -1's terugzetten naar NULL lijkt me

٩(͡๏̯͡๏)۶ ٩(●̮̮̃•̃)۶


  • whoami
  • Registratie: December 2000
  • Laatst online: 11:16
6K schreef op vrijdag 07 januari 2005 @ 16:01:
ik heb werkelijk waar geen idee, maar logischerwijs:
je geeft opdracht om null waardes te presenteren als -1.
Hij wijzigt op dat moment niets in de database, maar de dataset waarde gaat naar -1.
Op het moment dat je zegt EndCurrentEdit ga ik er van uit dat je het IEditableObject geimplementeerd hebt. Zoja, die gaat keihard saven AFAIK...
dus voor het saven moet je effe de -1's terugzetten naar NULL lijkt me
Als ik die EndCurrentEdit niet doe, doet hij dat automatisch.
Die -1 is eigenlijk (afaik) een representatie waarde; normaal gezien moet hij wel in staat zijn om te detecteren of er nu een null-waarde in die column zit of niet.

Mijn object is een DataSet , dus die heeft wel zowiezo IEditable al geimplementeerd.

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 11:16
*kick*

https://fgheysels.github.io/


Verwijderd

whoami schreef op vrijdag 07 januari 2005 @ 19:08:
[...]
Die -1 is eigenlijk (afaik) een representatie waarde;
[...]
Hoe kom je daarbij? Het is gewoon een vervangende waarde voor null values. Wat dat betreft is het dus vrij logisch dat je een FK violation exception krijgt bij het saven.

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:16
Verwijderd schreef op zaterdag 08 januari 2005 @ 22:59:
[...]


Hoe kom je daarbij? Het is gewoon een vervangende waarde voor null values. Wat dat betreft is het dus vrij logisch dat je een FK violation exception krijgt bij het saven.
Het is een representatie-waarde; check maar eens: als je zo'n nullValue definieert, en je checkt op IsfieldNull(), dan krijg je gewoon true terug als het veld null is.
Als je de waarde uitleest, dan krijg je -1 terug.

Dus, als ik deze code schrijf, dan moet die gewoon werken (en dat deed ze dus ook, als ik die EndCurrentEdit niet schrijf):

code:
1
2
3
4
5
6
7
8
if( myDataSet.SomeFieldIsNull() == false )
{
     cmdMyDataSet.Parameters["@paramName"].Value = myDataSet.SomeField;
}
else
{
     cmdMyDataSet.Parameters["@paramName"].Value = DBNull.Value;
}

https://fgheysels.github.io/


Verwijderd

whoami schreef op zondag 09 januari 2005 @ 11:10:
[...]


Het is een representatie-waarde; check maar eens: als je zo'n nullValue definieert, en je checkt op IsfieldNull(), dan krijg je gewoon true terug als het veld null is.
Als je de waarde uitleest, dan krijg je -1 terug.

Dus, als ik deze code schrijf, dan moet die gewoon werken (en dat deed ze dus ook, als ik die EndCurrentEdit niet schrijf):

code:
1
2
3
4
5
6
7
8
if( myDataSet.SomeFieldIsNull() == false )
{
     cmdMyDataSet.Parameters["@paramName"].Value = myDataSet.SomeField;
}
else
{
     cmdMyDataSet.Parameters["@paramName"].Value = DBNull.Value;
}
Even voor de duidelijkheid, ookal gebruik je EndCurrentEdit, dan krijg je nog steeds een true terug bij IsfieldNull() ?

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:16
Verwijderd schreef op zondag 09 januari 2005 @ 12:24:
[...]


Even voor de duidelijkheid, ookal gebruik je EndCurrentEdit, dan krijg je nog steeds een true terug bij IsfieldNull() ?
Nee, als ik een EndCurrentEdit gebruik, dan krijg ik een false bij IsFieldNull(), en dat is juist het probleem.

Ik heb die EndCurrentEdit erbij gezet omdat ik bv ook een save knop heb op m'n toolbar. Als ik een veld wijzig, en ik laat dat veld de focus houden, en klik op die knop in m'n toolbar, dan worden de wijzigingen voor dat veld niet doorgevoerd; daarom dus die EndCurrentEdit.
Als ik die EndCurrentEdit er niet bij zet, werkt alles dus zoals het hoort (behalve bovenstande situatie dus).

https://fgheysels.github.io/


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Je moet ook endcurrentedit aanroepen voor IEDER control waar je een veld aan bindt, dus die combobox, wellicht wat textboxes. Ja mooi spul, .net databinding...

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


  • tijn
  • Registratie: Februari 2000
  • Laatst online: 22-03 21:36
EfBe schreef op zondag 09 januari 2005 @ 12:33:
Je moet ook endcurrentedit aanroepen voor IEDER control waar je een veld aan bindt, dus die combobox, wellicht wat textboxes. Ja mooi spul, .net databinding...
Meen je dat? Je zou toch verwachten dat EndCurrentEdit() aanroepen van de currencymanager alle waarden van controls richting datasource door zou moeten sluizen (mits ze natuurlijk aan dezelfde datasource gebonden zijn). Het is mij in ieder geval nog nooit opgevallen dat dat niet goed werkt. Toch nog es nader bekijken dan.

Cuyahoga .NET website framework


  • whoami
  • Registratie: December 2000
  • Laatst online: 11:16
Update:
blijkbaar geldt deze 'bug' (?) niet voor alle velden:

Ik heb velden die aan een textBox gebinded zijn; de 'codegen:nullValue' staat daar ingesteld als 0 (codegen:nullValue="0").
Als die velden DBNull.Value zijn, dan krijg ik een 'true' terug op IsxxxxxNull().

De velden die aan een combobox gebinded zijn, hebben -1 als nullValue. Als die velden DbNull zijn, dan krijg ik een false terug op IsxxxxNull().

:?

https://fgheysels.github.io/


  • EfBe
  • Registratie: Januari 2000
  • Niet online
tijn schreef op zondag 09 januari 2005 @ 12:58:
Meen je dat? Je zou toch verwachten dat EndCurrentEdit() aanroepen van de currencymanager alle waarden van controls richting datasource door zou moeten sluizen (mits ze natuurlijk aan dezelfde datasource gebonden zijn). Het is mij in ieder geval nog nooit opgevallen dat dat niet goed werkt. Toch nog es nader bekijken dan.
Het gaat niet altijd goed omdat een setje textboxes waar een datarow aan gebind is als 1 gridrow wordt gezien (gelijk aan 1 gridrow) en er zijn setups denkbaar waarbij je dus niet automatisch de textbox waarden in je dataset terugkrijgt maar dit per textbox moet aangeven.

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

Pagina: 1