[C#] Datatable die extern verandert *

Pagina: 1
Acties:

  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 16-09 20:30
Ik heb een access database. Met deze db werken meerdere programma's. Als de database verandert, records in de database, vuurt een thread die de database doorzoekt een event af, zodat de applicatie weet dat de data van de database verandert is.

Ik heb nu een DataTable aan de tabel gekoppeld. Deze DataTable zit aan een datagridviewzodat ik de tabel kan zien. Als de desbetreffende table door een andere applicatie gewijzigd wordt moet de DataTable herbouwd.
Dit gaat allemaal prima. Nu wil ik de datasource van de datagridview updaten. Als ik hem wijzig met:
C#:
1
dataGridView1.DataSource=datatable;

dan gebeurd er niets. Pas als ik hem eerst op null zet en dan doe werkt het wel. Echter wordt dan mijn ingestelde lay-out van de datagridview gewijzigd, wat ik niet wil.

Hoe kan ik dus de datagridview updaten met de correcte datatable zonder dat mijn layout wordt vernaggeld?

if broken it is, fix it you should


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:28
Wat bedoel je met 'als de database verandert' ?
Als de structuur van je DB veranderd ? Indien je dit bedoeld, dan vraag ik me af of het wel opportuun is om je applicatie uit zichzelf te laten refreshen enzo. Zoveel zal het toch niet voorkomen dat de structuur van je DB veranderd ?

https://fgheysels.github.io/


  • Rowdy.nl
  • Registratie: Juni 2003
  • Laatst online: 28-11 14:33

Rowdy.nl

Koekje d'r bij?

Ik denk dat TS bedoeld dat de inhoud veranderd. (al schrijft ie dat idd niet zo duidelijk op)

Helpt een refresh/reload/bind op je datagridview object niet? Tis natuurlijk logisch dat ie niet de data direct refresht, dat doet ie pas na een andere actie van jou...

Edit:
Nevermind, ik lees heel krom. :S Zoals het er staat lijkt het iig imho nutteloos dat je layout hetzelfde blijft als de structuur veranderd?

[ Voor 22% gewijzigd door Rowdy.nl op 12-07-2007 12:09 ]

Rowdy.nl - X++ by day. C# by night. I drink coffee in the morning and beer in the evening.


  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 16-09 20:30
whoami schreef op donderdag 12 juli 2007 @ 12:04:
Wat bedoel je met 'als de database verandert' ?
Als de structuur van je DB veranderd ? Indien je dit bedoeld, dan vraag ik me af of het wel opportuun is om je applicatie uit zichzelf te laten refreshen enzo. Zoveel zal het toch niet voorkomen dat de structuur van je DB veranderd ?
Als applicatie 2 (draaiende op een andere plek) de db verandert (=waardes van een table, extra records) (niet de db structuur dus).

Dus een record wordt gewijzigd. De datatable wordt opnieuw gemaakt (doet de threasd die de db in de gaten houdt) deze nieuwe datatable wil ik in mijn datagridview zetten zonder dat de layout gewijzigd wordt. Dus die verandert record moet zichtbaar worden.

if broken it is, fix it you should


  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 16-09 20:30
Rowdy.nl schreef op donderdag 12 juli 2007 @ 12:07:
Ik denk dat TS bedoeld dat de inhoud veranderd. (al schrijft ie dat idd niet zo duidelijk op)

Helpt een refresh/reload/bind op je datagridview object niet? Tis natuurlijk logisch dat ie niet de data direct refresht, dat doet ie pas na een andere actie van jou...

Edit:
Nevermind, ik lees heel krom. :S Zoals het er staat lijkt het iig imho nutteloos dat je layout hetzelfde blijft als de structuur veranderd?
Refresh werkt niet (invalidate ook niet)
Hoe reload je?
Opnieuw binden doe ik nu (telkens als datatable verandert)
C#:
1
2
dataGridView1.DataSource=null;
dataGridView1.DataSource=datatable;

dit werkt, allen wordt de orginele layout (kolombreedte) vernaggeld.

if broken it is, fix it you should


  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 24-11 23:24

BikkelZ

CMD+Z

Misschien kun je de DataTable en datagridview scheiden van elkaar door die datagridview aan een andere klasse te hangen. Dat is misschien wel een semi-prutsoplossing, maar aan de andere kant loopt je database direct over in je interface, terwijl dat eigenlijk sowieso beter gescheiden zou moeten zijn.

Want nu ga je eigenlijk de boot in omdat je voor je layout afhankelijk bent van je data object, toch een beetje fout.

-----------

Bevat DataTable ook de data of is het een klasse die iets met data doet?

[ Voor 12% gewijzigd door BikkelZ op 12-07-2007 12:21 ]

iOS developer


  • DoDo
  • Registratie: Juli 2001
  • Laatst online: 02:32
Kun je niet dit doen:

C#:
1
2
DataGridView1.DataSource = mijndatasource;
DataGridView1.DataBind();


Hierbij zou de hele datagridview moeten updaten.

  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 16-09 20:30
BikkelZ schreef op donderdag 12 juli 2007 @ 12:19:
Misschien kun je de DataTable en datagridview scheiden van elkaar door die datagridview aan een andere klasse te hangen. Dat is misschien wel een semi-prutsoplossing, maar aan de andere kant loopt je database direct over in je interface, terwijl dat eigenlijk sowieso beter gescheiden zou moeten zijn.

Want nu ga je eigenlijk de boot in omdat je voor je layout afhankelijk bent van je data object, toch een beetje fout.
DataTable en grid zijn gescheiden. Datatable is een property van mijn model. Datagridview is een component van mijn viewer. Deze worden aan elkaar gekoppeld indien gewenst.

Ik wil dus gewoon dat de datagridview aangepast / geupdate / bijgewerkt wordt als de inhoud van de datatable aangepast wordt. Datatable blijft dezelfde tabel alleen sommige records veranderen en deze veranderingen wil ik in mijn datagridview zien.

EDIT:
datatbale is een datatsource van DataTable. Hier staat data van 1 gehele table uit mijn database.

[ Voor 8% gewijzigd door elgringo op 12-07-2007 12:26 ]

if broken it is, fix it you should


  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 16-09 20:30
DoDo schreef op donderdag 12 juli 2007 @ 12:20:
Kun je niet dit doen:

C#:
1
2
DataGridView1.DataSource = mijndatasource;
DataGridView1.DataBind();


Hierbij zou de hele datagridview moeten updaten.
Nee dat kan niet, die functie bestaat niet: KLIK

if broken it is, fix it you should


  • Rowdy.nl
  • Registratie: Juni 2003
  • Laatst online: 28-11 14:33

Rowdy.nl

Koekje d'r bij?

Kijk, had ik toch goed gegokt met mijn krom lezen... ;)

Wat jij in principe doet met op null zetten en opnieuw koppelen is een nieuwe/andere datatable aan je gridview knopen. Logisch dat die dan naar ze oorspronkelijke format terugkeert.

Maar moet die data in het gridview niet automatisch meeveranderen als je de data in de datatable veranderd? Probeer dus eens een refresh/databind oid op je datatable object los te laten?

Rowdy.nl - X++ by day. C# by night. I drink coffee in the morning and beer in the evening.


  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 16-09 20:30
Rowdy.nl schreef op donderdag 12 juli 2007 @ 12:27:
Kijk, had ik toch goed gegokt met mijn krom lezen... ;)

Wat jij in principe doet met op null zetten en opnieuw koppelen is een nieuwe/andere datatable aan je gridview knopen. Logisch dat die dan naar ze oorspronkelijke format terugkeert.

Maar moet die data in het gridview niet automatisch meeveranderen als je de data in de datatable veranderd? Probeer dus eens een refresh/databind oid op je datatable object los te laten?
Hoe doe je dat? Deze zocht ik maar kon ik niet vinden.

if broken it is, fix it you should


  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 16-09 20:30
Hmm, als ik mijn datagrid zie terwijl de data verandert zien ik niets. een refresh() doet niets. Echter als ik op een kolom klik om te gaan sorteren verandert hij wel. Wat roept die klik aan, zodat ik dat kan uitvoeren.

if broken it is, fix it you should


  • Eskimootje
  • Registratie: Maart 2002
  • Laatst online: 22:17
Moet je niet je datasource eerst refreshen en daarna pas de view?

Zolang je datasource hetzelfde blijft en je refresh tekent die dezelfde data opnieuw, de datasource moet zichzelf updaten en daarna moet je refreshen.

[ Voor 54% gewijzigd door Eskimootje op 12-07-2007 13:39 ]


  • tijn
  • Registratie: Februari 2000
  • Laatst online: 02-11 15:59
En als je nou eens Refresh() van de tussenliggende currencymanager aanroept?

(van MSDN, http://msdn2.microsoft.co...nager.refresh(vs.80).aspx)

code:
1
2
3
4
private void RefreshGrid(object dataSource){
    CurrencyManager myCurrencyManager = (CurrencyManager)this.BindingContext[dataSource];
    myCurrencyManager.Refresh();
}

Cuyahoga .NET website framework


  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 16-09 20:30
De DataTable wordt vanuit een andere thread gemaakt dan waar de datagridview zit.
laten we de thread van de GUI (en datagridview) ff thread 1 noemen en waar datatable gemaakt wordt thread 2.

Thread 2 vuurt event af dat dt (datatable) vernadert is. thread 1 vangt deze af en moet de gui bijwerken (wat dus niet gebeurd). Tijdens het bijwerken van dt door thread 2 wordt de dt gelokct:
C#:
1
2
3
lock(datatable){
//lalalala updaten
}


Nu constateer is dat de datatable wel goed geladen is echter wordt dit neit getoond. Als er op een header geklikt wordt om te gaan sorteren komt de data er wel.

nu heb ik hier gekeken. En vraaag me af of dit van mij op toepassing is. Of zie ik iets anders over het hoofd?

if broken it is, fix it you should


  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 16-09 20:30
tijn schreef op donderdag 12 juli 2007 @ 13:40:
En als je nou eens Refresh() van de tussenliggende currencymanager aanroept?

(van MSDN, http://msdn2.microsoft.co...nager.refresh(vs.80).aspx)

code:
1
2
3
4
private void RefreshGrid(object dataSource){
    CurrencyManager myCurrencyManager = (CurrencyManager)this.BindingContext[dataSource];
    myCurrencyManager.Refresh();
}
Dit werkt idd, wel vreemd.

EDIT:
toch niet.
Hij werkt alleen als de datagridview NIET zichtbaar is, indien wel doen hij het niet. Als ik een breakpoint zet doet hij het altijd.

Verder als ik hem actief heb en de lijst wordt bijgewerkt krijg in wel een goeie tabel te zien, alleen staat hier NIETS in. Stel ik heb ik tabel met 100 records (van 5 kolommen) krijg in 5 kolommen*100rijen lege cellen te zien. Heb ik heb niet actief werkt ie gewoon.
EDIT2: de DataTabel wordt correct gevuld, hier staat alle data in die in de db staan (en dus geen legel velden. Het laden van de DataTable in de datagridview gaat zo:
C#:
1
2
3
4
5
6
7
8
9
if (this.InvokeRequired)
            {
                this.BeginInvoke(new Model.TablesUpdatedEvent(Model_TablesUpdated), new object[] { tablename });

                return;
            }
           CurrencyManager myCurrencyManager;
           myCurrencyManager = (CurrencyManager)dataGridView2.BindingContext[Model.OL50Table];
           myCurrencyManager.Refresh();  

(invoke omdat deze eventhandler vanuit andere thread aangeroepen wordt)
Als ik een andere table pak, een kleinere (2525 records ipv 8060 records) doet hij het wel altijd.

[ Voor 56% gewijzigd door elgringo op 12-07-2007 15:49 ]

if broken it is, fix it you should


Verwijderd

Ik weet niet welke versie van het .Net framework je gebruikt?

Als je versie 2.0 gebruikt zou je eens kunnen kijken naar het BindingSource compenent. Als je deze aan de datasource van je grid hangt en aan de datasource van je BindingSource de DataTable knoopt, zou het wel eens kunnen werken.

iets als:
code:
1
2
BindingSource bs = new BindingSource();
bs.DataSource = myDataTable;


En als dit niet genoeg is zou je bij het veranderen van de data het volgende kunnen proberen:
code:
1
bs.ResetBindings(true);


Nog wat meer info:
[url]http://http://msdn2.microsoft.com/en-us/library/system.windows.forms.bindingsource.resetbindings.aspx[/url]


Het lang geleden dat ik er mee gewerkt heb, ik had er destijds wel wat problemen mee, maar in het algemeen is het een mooie component voor lijsten/tabellen die veranderen. Of het werkt met de threads die de tabel veranderen zou ik niet weten.

  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 16-09 20:30
Verwijderd schreef op donderdag 12 juli 2007 @ 15:57:
Ik weet niet welke versie van het .Net framework je gebruikt?

Als je versie 2.0 gebruikt zou je eens kunnen kijken naar het BindingSource compenent. Als je deze aan de datasource van je grid hangt en aan de datasource van je BindingSource de DataTable knoopt, zou het wel eens kunnen werken.

iets als:
code:
1
2
BindingSource bs = new BindingSource();
bs.DataSource = myDataTable;


En als dit niet genoeg is zou je bij het veranderen van de data het volgende kunnen proberen:
code:
1
bs.ResetBindings(true);


Nog wat meer info:
[url]http://http://msdn2.microsoft.com/en-us/library/system.windows.forms.bindingsource.resetbindings.aspx[/url]


Het lang geleden dat ik er mee gewerkt heb, ik had er destijds wel wat problemen mee, maar in het algemeen is het een mooie component voor lijsten/tabellen die veranderen. Of het werkt met de threads die de tabel veranderen zou ik niet weten.
Deze doet wel wat ik wil. Ik krijg nu geen lege cellen
(aan de andere kant weet ik ook niet of dat de daadwerkelijk oorzaka is, omdat ik de threads ook wat heb herschreven.)
Maar hij doet het.

if broken it is, fix it you should

Pagina: 1