[C#.NET]DataGrid naar datasource wegschrijven

Pagina: 1
Acties:
  • 155 views sinds 30-01-2008
  • Reageer

  • Grimm9mm
  • Registratie: Maart 2000
  • Laatst online: 13:36
Ik heb weer een probleempje met die irritant uitgebreide datagrids... als iemand een waarde aan het typen is in het datagrid, en dan direct op een "save"-knop drukt (die de gekoppelde datatable wegschrijft naar een database, dan wordt die laatst veranderde waarde niet meegenomen, omdat dat edit-veld nog openstond.

Hoe kan ik dus de HUIDIGE waarde van een datagrid per direct wegschrijven naar onderliggend datasource?

Ohja, de tabel is gewrapped in een dataview die als datasource voor de datagrid functioneert... ik weet niet of die zelf ook nog buffered?

  • whoami
  • Registratie: December 2000
  • Laatst online: 15:31
Als je datasource een dataset of een datatable is, AcceptChanges aanroepen.

https://fgheysels.github.io/


  • Grimm9mm
  • Registratie: Maart 2000
  • Laatst online: 13:36
Hij deselecteert em dan wel leuk, maar als ik daarna de tabel weer ophaal staan de oude waarden weer terug...
AcceptChanges() voert volgens mij alle deletions, inserts en updates door in de tabel zelf, en gooit de originele waarden weg... maar op die manier kunnen er geen database-updates gegenereerd worden met een commandbuilder, als je namelijk naar de database wegschrijft, dan schrijft hij alleen de "GetChanges()" tabel weg naar de database... als die changes allemaal al als committed ingevoerd zijn in de tabel zal de functie getchanges gewoon een lege tabel of null teruggeven.

  • whoami
  • Registratie: December 2000
  • Laatst online: 15:31
Ok, da's waar. :P

Je moet EndEdit() van de huidige DataRow aanroepen dan.

https://fgheysels.github.io/


  • Grimm9mm
  • Registratie: Maart 2000
  • Laatst online: 13:36
ok, iets duidelijker dus...

Mijn changes worden wel weggeschreven naar de database, behalve de ALLERLAATSTE ingevoerde waarde, waarbij de row-header nog een duidelijk potlood-icoontje laat zien dat die row op DIT moment ge-edit wordt.

Hoe kan ik dus zorgen dat die laatste row/cell-edit wordt doorgevoerd, net alsof je in een andere cell klikt. Ik heb al geprobeerd om een andere cell of row te selecteren met de "Select()" functie... maar dat werkte dus niet.

  • Grimm9mm
  • Registratie: Maart 2000
  • Laatst online: 13:36
Ah, even proberen.

  • whoami
  • Registratie: December 2000
  • Laatst online: 15:31
Door die EndEdit() method op te roepen:

code:
1
myDataTable.Rows[myDataGrid.CurrentRowIndex].EndEdit();


en daarna je updates door te voeren naar de databank:
code:
1
myDataAdapter.Update(myDataTable);

[ Voor 33% gewijzigd door whoami op 19-11-2003 16:11 ]

https://fgheysels.github.io/


  • Grimm9mm
  • Registratie: Maart 2000
  • Laatst online: 13:36
Wat lastig is... aangezien die datagrids vaak op een bepaalde manier gesorteerd is, hoe kom je aan de juiste rowIndex (dus de index van de table, en niet van de grafische gesorteerde dataGrid)
ik heb dus al geprobeerd
C#:
1
2
3
4
5
int rowIndex = dataGrid.CurrentRowIndex;
DataView dv = (DataView)dataGrid.DataSource;
DataTable dt = dv.Table;
dt.Rows[rowIndex].EndEdit();
connector.SaveTable(dt);


Helaas werkte dit niet.... zou die tussenliggende dataview roet in het eten gooien?

  • whoami
  • Registratie: December 2000
  • Laatst online: 15:31
Nu ik eraan denk,

Je gebruikt een DataView, die heeft natuurlijk geen rows' collection, maar wel een indexer waarmee je een row kunt accessn:
code:
1
myDataView[0].EndEdit();


Heel defensief is dit misschien niet, dus misschien ga je best als volgt te werk:
- bepaal het id (pk) van het record van de geselecteerde rij in je datagrid.
- zoek de juiste DataRow in je DataTable die dit id heeft als PK
- doe op die row de EndEdit()

[ Voor 42% gewijzigd door whoami op 19-11-2003 16:21 ]

https://fgheysels.github.io/


  • Grimm9mm
  • Registratie: Maart 2000
  • Laatst online: 13:36
Na stugweg het volgende te doen:

C#:
1
2
3
4
5
6
7
8
9
10
11
DataView dv = (DataView)dataGrid.DataSource;
DataTable dt = dv.Table;
for (int r=0; r<dv.Count; r++) 
{
  dv[r].EndEdit();
}
for (int r=0; r<dt.Rows.Count; r++) 
{
  dt.Rows[r].EndEdit();
}
connector.SaveTable(dt);


kom ik tot de conclusie dat hier het probleem niet ligt... want dit werkt "gewoon" ook niet... het moet dus bij het datagrid zelf liggen. Waarom konden ze niet in datagrid een functie "EndEdit()" maken?

  • whoami
  • Registratie: December 2000
  • Laatst online: 15:31
Omdat je vanalles aan die datagrid kunt binden, en dat die EndEdit dus voor iedere 'datasource' verschillend kan zijn.

Maar, wat bedoel je met 'niet werken'?

https://fgheysels.github.io/


  • EfBe
  • Registratie: Januari 2000
  • Niet online
EndEdit() wordt aangeroepen DOOR de datagrid, wanneer jij na het editen naar een andere cel of row gaat.

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


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:31
EfBe schreef op 19 november 2003 @ 16:42:
EndEdit() wordt aangeroepen DOOR de datagrid, wanneer jij na het editen naar een andere cel of row gaat.
Maar, de TS wil dat die EndEdit() ook aangeroepen wordt als hij niet expliciet naar een andere row gaat.
Volgens wat ik begrijp, edit hij de values in een cell, en klikt hij daarna direct op een button die z'n aanpassingen naar de DB gaat gaan wegschrijven.

Ik heb net ff een testje gedaan, en dat werkt perfect:
code:
1
2
3
DataRow dr = ((DataTable)dataGrid1.DataSource).Rows[dataGrid1.CurrentRowIndex];
dr.EndEdit();
MessageBox.Show(dr["naam"].ToString());

https://fgheysels.github.io/


  • Grimm9mm
  • Registratie: Maart 2000
  • Laatst online: 13:36
Idd, ik wil simuleren alsof ik naar een andere cell ben overgestapt, zodat datagrid ook EndEdit() aanroept, want handmatig werkt bij mij echt niet met dat DataView ertussen.

  • tijn
  • Registratie: Februari 2000
  • Laatst online: 22-03 21:36
Grimm9mm schreef op 19 november 2003 @ 16:54:
Idd, ik wil simuleren alsof ik naar een andere cell ben overgestapt, zodat datagrid ook EndEdit() aanroept, want handmatig werkt bij mij echt niet met dat DataView ertussen.
En als je nu eens EndCurrentEdit van de currencymanager aanroept?
C#:
1
2
3
4
5
CurrencyManager gridCurrencyManager = 
        (CurrencyManager)this.BindingContext
        [dataGrid1.DataSource, dataGrid1.DataMember];
gridCurrencyManager.EndCurrentEdit();
MessageBox.Show("End Edit");

Dit zou altijd moeten werken, ongeacht of je datasource een dataview, datatable of een custom collection is.
In de help adviseren ze trouwens wel om EndEdit van je datarow aan te roepen :?

Cuyahoga .NET website framework


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Grimm9mm schreef op 19 november 2003 @ 16:54:
Idd, ik wil simuleren alsof ik naar een andere cell ben overgestapt, zodat datagrid ook EndEdit() aanroept, want handmatig werkt bij mij echt niet met dat DataView ertussen.
De selected cell wijzigen en daarna wegschrijven werkt ook niet? Let wel: EndEdit() is heteinde van de edit cycle, dus wanneer je weg wilt schrijven terwijl iemand nog een celledit open heeft, kan eigenlijk niet, de edit is niet voltooid. Klinkt brak, maar zo werken grids nu eenmaal en daarom moeten ze eigenlijk ook verbannen worden :)

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


  • Grimm9mm
  • Registratie: Maart 2000
  • Laatst online: 13:36
EfBe schreef op 19 november 2003 @ 18:41:
[...]

De selected cell wijzigen en daarna wegschrijven werkt ook niet? Let wel: EndEdit() is heteinde van de edit cycle, dus wanneer je weg wilt schrijven terwijl iemand nog een celledit open heeft, kan eigenlijk niet, de edit is niet voltooid. Klinkt brak, maar zo werken grids nu eenmaal en daarom moeten ze eigenlijk ook verbannen worden :)
Tja, je zou datagrid idd ook alleen als read-only moeten gebruiken, maar al wil je snel ff in een database iets veranderen... tja...
DataGrids zijn slecht, maar de standaard data-access-wizard forms zijn NOG slechter ;-)

Ik moet gewoon wat wennen aan dat databinding-gedoe.

  • whoami
  • Registratie: December 2000
  • Laatst online: 15:31
EfBe schreef op 19 november 2003 @ 18:41:
[...]
Klinkt brak, maar zo werken grids nu eenmaal en daarom moeten ze eigenlijk ook verbannen worden :)
ListViews de gekste \o/

Grids zijn natuurlijk wel makkelijk, met enkele lijnen code laat je de gewenste data zien, en je kan die grid natuurlijk ook wel read-only maken.

https://fgheysels.github.io/


  • Grimm9mm
  • Registratie: Maart 2000
  • Laatst online: 13:36
Ongelooflijk... ik heb dus mijn "save" knop uit het mainmenu gehaald, en een gewone knop op het form aangemaakt, en nu saved hij em wel volledig. Vreemd dat een menuitem zo anders werkt dan een knop.
En dat helemaal zonder "EndEdit()" enzo.

.NET is tof enzo... maar dit soort dingetjes... argh

  • EfBe
  • Registratie: Januari 2000
  • Niet online
gokje: een menu haalt de focus niet van de grid af, een button aanklikken wel. Focus weg? -> de value's EndEdit wordt aangeroepen, daarna de row's EndEdit() (en daarna, omdat het microsoft is en totaal geen reden heeft, de cell's value's EndEdit() NOG een keer... geen grapje).

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


  • NoReason
  • Registratie: Mei 2003
  • Laatst online: 28-04 15:54
sorry voor het ophalen van deze oude topic... maar ik had hetzelfde probleem als de TS (hij nam mijn laatste waarde niet mee als ik direct op een knop in het mainmenu drukte)
Maar ik heb een oplossing gevonden:

http://www.thescarms.com/dotnet/EndEdit.asp

het gelijkt sterk op de oplossingen die hier gegeven werden, maar slechts deze werkt! hopelijk kan ik hiermee toch nog iemand helpen.

It's time to kick ass and chew bubble-gum, and I'm all out of gum.

Pagina: 1