30. august 2004 - 14:53Der er
10 kommentarer og 1 løsning
Fjerne kolonne fra datagrid
Jeg har oprettet et datagrid i VS.net (drag 'n drop) og via et sql-kald populeret gridden med data via en datatable -> dataview.
Én af kolonnerne jeg har lavet indeholder ID'et fra databasen, som jeg skal bruge ved updatefunktioner, men jeg ønsker ikke at vise denne kolonne til brugeren. Hvordan fjerne jeg den eller rettere gør den usynlig?
Min GetSource funktion opretter indholdet på følgende måde:
det er ikke en forudsætning af det gøres design time... men det er en forudsætning at kolonnerne er til stede - du kan lige så fint gøre det programmatisk, og det er supernemt at oprette kolonnerne i koden istedet - det fylder ikke mere end hvis du gør det i designeren. du kan f.eks. oprette en databunden kolonne sådan her :
BoundColumn bc = new BoundColumn(); bc.HeaderText = "hej"; bc.DataField = "FldString"; this.Dg.Columns.Add(bc);
Og den slags kolonner kan du vise og skjule som du vil - jeg vil tro at det vil være det nemmeste for dig.
alternativt kan du arbejde lidt med datagrundlaget for griddet.
det er rigtig lækkert at arbejde med, og man kan lave de fede konfigurationsmuligheder på den måde. giv det et skud, og sig til hvis du går i stå, så skal jeg nok hjælpe med det jeg kan. mvh
Hmm... Lige lidt spørgsmål: Skal jeg stadig bruge datatable og dataview til at hente data ind i mit datagrid? Hvordan virker datafield-property'en? (Hvad er det?) Hvordan får jeg data i de enkelte rækker?
BoundColumn bc = new BoundColumn(); bc.HeaderText = "hej"; //bc.DataField = "FldString"; this.Dg.Columns.Add(bc);
virker fint og kollonnen fremkommer, men hvor, hvornår og hvordan får jeg data i?
det er ligemeget hvilken en af typerne du bruger (dataset, dataview, datatable ...). det du fortæller med .DataField er, at du vil vise den værdi der står i den kolonne der hedder det du angiver som værdi. har du en select somestring, someint, something from tblthings som du fylder i en datatable, kan du altså angive en kolonne sådan her :
BoundColumn bc = new BoundColumn(); bc.HeaderText = "hej"; bc.DataField = "somestring"; this.Dg.Columns.Add(bc);
og så får "automatisk" hældt den værdi der i den række der bindes til "under" den kolonne.
hvis du prøver at abbonere på det event der hedder ItemDataBound på dit grid kan du kigge lidt nærmere på det.
en kode som denne (altså i en ItemDataBound-handler) :
if(e.Item.DataItem == ListItemType.Item || e.ItemDataItem == ListItemType.AlternatingItem) { // her får du fat i alle "normale" rækker én af gangen, og du kan så gøre lidt af hvert : // tilføj en kontrol til en cell e.Item.Cells[0].Controls.Add(new LiteralControl("hej"));
// kigge på indholdet af en celle string tekst = e.Item.Cells[0].Text;
// få fat - her kommer det interessant - i datagrundlaget for rækken DataRowView drv = e.Item.DataItem;
// en bestemt værdi i datagrundlaget string tekst = drv["somestring"].ToString(); // her har du hvad der trækker ved at angive DataField.
}
Håber det gav lidt mening - ellers råber du op :o)
Private Sub DataGrid1_ItemDataBound(s As Object, e As DatagridItemEventArgs) e.Item.Cells(1).Visible = False End Sub
Perfekt! Tilføjede OnItemDataBound()-funktionen, og det virkede! :D Happy-happy-joy-joy! Næste gang jeg laver et dataset, vil jeg nu bruge din fremgangsmåde... Noget smartere og i den grad mere fleksibelt...
Tak skal du have igen-igen...
Smid et svar i en ruf! aaahh... Ikke noget overarbejde til mig i dag!
Jeg håber, dem der fandt på Eksperten er blevet overdrevet rige... Det har de fortjent :) Så kunne de også give dig løn for at hjælpe tåbelige n00bs, som mig :)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.