[C#/WindowsForms] DataGridView binden aan andere controls

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Sspruijt
  • Registratie: Mei 2007
  • Laatst online: 19-09 15:11
Beste tweakers,

Ik zit met een probleem waar ik al een paar dagen mee worstel. Ik wil het volgende doen.
Ik ben een applicatie aan het maken waarin er profielen kunnen worden beheerd. Ik heb een GridView gebonden aan een database. Dit werkt prima. Ik wil nu alleen wat basic gegevens laten weergeven in de GridView en als er een wordt geselecteerd komen de details tevoorschijn in numeric boxen en textfields eronder. Dit lijkt me wat makkelijker te werken voor de gebruiker dan 1 grote tabel aanpassen constant. Ik heb nu dus de textfields etc gebonden aan de BindingSource die wordt aangemaakt bij de GridView. Dit alles werkt goed en als er rows worden geselecteerd geven de textfields etc de juiste waarden aan. Het gaat alleen fout als ik een nieuwe regel wil toevoegen.

Ik kan wel dingen aanpassen, maar het wordt nooit opgeslagen. Als ik weer naar een andere regel ga wordt de nieuwe regel gelijk gewist.

Ik heb de GridView zo ingesteld dat wel alle kolommen in de database erin staan, maar de velden die eronder moeten worden weergegeven heb ik invisible gemaakt.

Is wat ik wil uberhaubt mogelijk? En zo ja, hoe kan ik een nieuwe kolom succesvol toevoegen die ook wordt opgeslagen in de database?

Ik heb geen code om te laten zien, omdat alles door Visual Studio is gegenereerd. Alvast bedankt.

Acties:
  • 0 Henk 'm!

  • CRiMiNaL
  • Registratie: Mei 2002
  • Laatst online: 10-01-2024

CRiMiNaL

Witlof ^^

Er zijn een paar dingen voor mij onduidelijk, maar ik zal je uitleggen hoe ik het heb:

SQL Tabel -> TableAdapter -> DataSet -> GridViewTable

Als je data in je GridView aanpast, word dit dan ook aangepast in de dataset die aan de GridViewTable.DataSource gekoppeld zit ? Zo ja, dan moet je alleen nog de wijzigingen in je DataSet synchroniseren met je TableAdapter (en daarmee je daadwerkelijke tabel).

Omdat je schrijft dat je dus ook met losse input velden werkt, zul je op het TextChanged event wat code moeten stoppen die je dataset update.

Een nieuwe kolom toevoegen zul je lastig kunnen doen met de automatisch gegenereerde code voor je DataSet, je kunt in de DataSet designer wel gewoon een nieuwe kolom aanmaken, waarop de compiler nieuwe code voor je genereerd, maar hierdoor word er nog niet automatisch ook een kolom aan je tabel toegevoegd.

Of bedoel je het toevoegen van een rij ?
Probeer iig het een en ander nog even te verduidelijken d.m.v. wat code voorbeelden.

... MMORPG Addict.


Acties:
  • 0 Henk 'm!

  • Sspruijt
  • Registratie: Mei 2007
  • Laatst online: 19-09 15:11
Hierbij eerst een screenshot ter verduidelijking:
Afbeeldingslocatie: http://farm3.static.flickr.com/2472/3610779152_cb629ba9a3_m.jpg

Zoals ik het nu heb is volgens mij als volgt. Ik heb een SQL Table en een DataSet met daarin een tableAdapter voor die tabel. Daarnaast heb ik een GridView die via een bindingSource is verbonden met de tableAdapter. Verder heb ik een hoop textfields en numericBoxes die via dezelfde bindingSource verbonden zitten aan de specifieke kolommen.

Verder is het gridView readOnly. De waarden in de gridView worden ingevuld in de textfields eronder en kunnen zo dus aangepast worden. Als ik een rij aanklik veranderen de waarden in de textfields juist. Als ik dan een veld aanpas en met tab naar de volgende ga zie ik het veld ook veranderen in de gridView. Echter word het niet opgeslagen in de database (via de tableAdapter).

Acties:
  • 0 Henk 'm!

Verwijderd

Ik zou met een Bindingsource werken en de controls daarmee koppelen.

C#:
1
2
3
BindingSource gegevens = new BindingSource(Dataset,"Tabelnaam");
//of
BindingSource gegevens = new BindingSource(DataTable,"");


Dan zet de Datasource van de Gridview op de Bindingsource

C#:
1
gegevensgrid.DataSource = gegevens


vervolgens elk veld koppelen aan een bepaald veld van de bindingsource

C#:
1
naambelgedrag.setDataBinding(gegevens,"kolomnaam");


Hierbij zullen alle velden aangepast worden op de selectie.

Je hoeft ze niet ReadOnly te zetten want iets wordt niet eerder werkelijk veranderd in de database totdat je de DataAdapter.update gebruikt. Gegevens zullen echter wel verwerkt worden in de Bindingsource zelf en ook de DataSet.

[ Voor 15% gewijzigd door Verwijderd op 10-06-2009 00:05 . Reden: beetje extra tekst laatste regels ]


Acties:
  • 0 Henk 'm!

  • Sspruijt
  • Registratie: Mei 2007
  • Laatst online: 19-09 15:11
freaky1983, bedankt voor de duidelijke uitleg! Ik begin 'the big picture' eindelijk een beetje te zien volgens mij. Het werkt allemaal prima op het moment, behalve het toevoegen van een nieuwe row werkt nog niet lekker. Ik heb een knop gemaakt, 'Nieuw', en die roept de functie AddNew() aan van de BindingSource en dit voegt netjes een nieuwe row toe in het datagrid. De waarden in de tekstvelden resetten echter niet naar 0 dus dit doe ik handmatig. Alleen het probleem is nu dat dit er niet voor zorgt dat de geresette waarden in het bindingSource terecht komen. Wanneer ik een nieuwe row toevoeg en niet alle waarde verander (dus op 0 laten staan) zal de rij weer gewist worden, omdat de database constraints niet goed zijn (de niet ingevulde waarden zijn dus nog NULL ipv 0). Enig idee hoe dit opgelost kan worden? Ik heb al geprobeerd om de NULL waarde in de bindingSource op 0 te zetten, maar dit haalt niks uit.

Acties:
  • 0 Henk 'm!

Verwijderd

Om in een BindingSource een row toe te voegen en aan te passen gebruik je inderdaad AddNew().
Maar dat staat de positie nog niet naar de nieuwe toe. Dus eigenlijk altijd 2 instructies achter elkaar

C#:
1
2
3
4
//Nieuwe regel toevoegen aan BindingSource
BindingSource.AddNew();
//Positie van de BindingSource naar de laatste row (De nieuwe dus)
BindingSource.MoveLast();


Dit zorgt er ook direct voor dat alle tekstvelden enz gevuld worden met de lege waarden van de nieuwe row.

Het probleem met de constaints kan ik je niet direct mee helpen denk ik.
Krijg je de melding bij het updaten van de Adapter? Weet je om wat voor Constraint het gaat ? (Betreft het een autonummering veld, heeft het te maken met een relatie of mag iets niet NULL zijn enz)

Vergeet sowieso niet het volgende als je wilt opslaan in de database
Je kan of per rij EndEdit gebruiken of op de hele BindingSource zelf.
Dit zorgt ervoor dat de Edit mode van een rij of bindingsource stopt en hier controleerd hij (volgens mij) ook de Constraints. De constraints staan namelijk "uit" in Edit mode.

[ Voor 49% gewijzigd door Verwijderd op 12-06-2009 08:35 . Reden: typo ]

Pagina: 1