Pa parciojalno si u pravu, ali pored toga sto grid cuva svoj layout, svakio iole pristojan grid moze da dinamicki generise kontrole na osnovu izvora, bilo runtime, bilo kao inicijalno podesavanje grida (sto je pretpostavljam ono sto Pedja hoce).
Pedja pazi ovako, cisto da neke zabune izbegnemo
DataSet je detached (otkacen od izvora) multi-table multi-row memorijski storage za podatke. Ako je tipiziran nosi runtime informacije o svojoj semi (ovo je vazno za tebe)
Da bi neka kontrola mogla da prikaze podatak iz dataseta mora da postoji komponenta koja ce da mu doda nedostajuce funkcije (iteraciju, pamcenje pozicije, itd). Tu funkciju obavlja BindingSource. Binding source pored toga ima i dosta drugih uloga koje tebi za ovo nisu vazne, ali jedna od stvari koje ti mogu biti korisne je da binding source moze da konzumira sijaset razlzlicitih vrsta izvora podataka (od kojih je dataset samo jedna) i da prema kontrolama prikaze te izvore na unfiorman nacin. Grid (ili bilo koja druga kontrola) moze da iskoristi binding source da runtime ili design time otkrije shemu izvora podataka. Dakle za ono sto ti hoces minimum (a i maksimum) je neophodno da na formi postoji dataset i bindingsource i da su povezani, sve ostalo je visak.
Dataadapter je uprosceno kombinacija vise TQuery objekata za razlicite CRUD operacije plus za sve custom oepracije koje defines. Sam VS i pomaze tako sto za dataset koji prevuces iz baze sam generise kod za tipizirani dataadapter u kojem automatski generise sve CRUD query-e i mapiranja izmedju kolona Sql(Ce)Command-a i dataset table polja. pored toga ima jos funkcija (npr asinhrone metode, tako da korisnici ne cekaju blokirani da se izvrsi dugacak query)
Object lifetime, ovo je za bivse delphi programere najvaznije da svare. Komponenta koju si stavio na formu nije isto kao objekat koji se nalazi u njenoj referenci. Zvuci zbunjujuce pa cu probati da malo objasnim.
- recimo bacio si dataset i bindingsource na formu i povezao (dataadapter koji ti je designer onda napravio si obrisao, ne treba nam)
- VS designer to serijalizuje kao seriju instrukcija u form.designer.cs fajlu, nesto nalik ( pogledaj i sam)
Code (csharp):
dataset1
= new DataSetXX
();
bindingSource1
= new BindingSource
();
bindingSource1
.DataSource = dataset1
;
bindingSource1
.DataMember = "Tabela";
taj kod se izvrsava u visual studiu tokom dizajniranja forme (sto ti omogucava da u gridu design time vidis polja) i izvrsava se u runtime u InitializeComponentes() kroz form_init. U tom trenutku se u dataset1 varijabli nalazi dataset (nazovimo ga ds000) u bindingsource1 se nalazi bs000 i bindingsource1 .DataSource == instance(ds000)
Ako ti sada posle init uradis dataset1 = mojSingletonDataSet; sta se desava?
dataset1 == mojSingletonDataSet
ALI
bindingsource1 .DataSource == instance(ds000)
dakle ti si promenio dataset1 referencu ali su SVI bindingsources VEC povezani na ds000 i zato ti ne vidis rezultat. Samim tim sto si promenio referencu dataset1 NE ZNACI da je ds000 nestao, on i dalje zivi kroz bindingsource1.DataSource i uredno servira svoje podatke kontrolama zakacenim na binding source. Da bi postigao ono sto hoces moras u runtime-u potpuno da izignorises dataset1 (on je odradio svoje, pomogao ti je u designu da namestis grid) i direktno upucas novi dataset u binding source:
bindingsource1 .DataSource = mojSingletonDataSet;
bindingsource ima event koji puca kad se promeni DataSource, gridovi SVI ako icemu valjaju kace se na taj event i bivaju obavesteni da je izvor promenjen i odmah rade reload/repaint.
Sve to imas u onom solutionu sto sam ti okacio u prethodnoj poruci. Jesi pogledao to?
[Ovu poruku je menjao mmix dana 24.12.2010. u 22:22 GMT+1]
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić