Avatar billede stefan_v Nybegynder
30. august 2004 - 14:53 Der 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:

indhold.Columns.Add(new DataColumn("Markedsføringsomkostninger", typeof(Double)));

Hvor "indhold" er en datatable.



Via en datareader lægger jeg så data i de enkelte rows:

while(datareader.Read())
{
dr = indhold.NewRow();
dr[0] = Double.Parse(datareader[0].ToString());
[...]
indhold.Rows.Add(dr);
}



Og tilføjer så dette til et dataview:

indholdView = new DataView(indhold);


Min Bind-funktion:

public void BindGrid()
{
FondomkostningerGrid.DataSource = indholdView;
FondomkostningerGrid.DataBind();
}

Hvor "FondomkostningerGrid" er mit datagrid.

Jeg har læst mig frem til løsninger, hvor width sættes til 0, men jeg kan ikke finde ud, hvordan jeg får fat i width-attributten...

Nogen der kan hjælpe?

stefan_v
Avatar billede snepnet Nybegynder
30. august 2004 - 15:00 #1
du kan sætte Visible = false på kolonner på et datagrid.
altså :
datagrid1.Columns[index].Visible = false;
Avatar billede stefan_v Nybegynder
30. august 2004 - 15:03 #2
Ja... og nej... Det kan kun lade sig gøre, hvis kolonnerne er er oprettet i design-time... og det er mine ikke...

med 'datagrid1.Columns[index]' vil jeg kun få én kolonne, nemlig en 'EditCommandColumn', som er den eneste der ikke bliver oprettet i run-time.
Avatar billede snepnet Nybegynder
30. august 2004 - 15:38 #3
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.
Avatar billede stefan_v Nybegynder
30. august 2004 - 15:50 #4
ok... Det vil jeg da straks kigge nærmere på...
Avatar billede snepnet Nybegynder
30. august 2004 - 15:56 #5
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
Avatar billede stefan_v Nybegynder
30. august 2004 - 16:21 #6
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?

Er lidt på bar bund... :/

Har du evt. et link til en tutorial eller lign.?
Avatar billede snepnet Nybegynder
30. august 2004 - 16:33 #7
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)

mvh
Avatar billede snepnet Nybegynder
30. august 2004 - 16:34 #8
tuts... dem er der rigtig mange af på nettet .... hende her har en didikeret side for datagriddet :

http://www.datagridgirl.com (der er links til mange eksempler derfra)
Avatar billede stefan_v Nybegynder
30. august 2004 - 16:56 #9
SUCCES!

Jeg kiggede lidt på datagridgirl.com og fandt følgende:
Question: How do I hide a column in my Datagrid if AutoGenerateColumns is set to True?

Answer: AutoGenerated columns do not appear in the Datagrid's Columns() collection, and so the usual method of hiding a Datagrid column will fail:

'Will NOT work for AutoGenerated columns:
Datagrid1.Columns(1).Visible = False

So the place to handle this is in the ItemDataBound event of the Datagrid:

<asp:DataGrid id="Datagrid1" runat="server" AutoGenerateColumns="True" OnItemDataBound="Datagrid1_OnItemDataBound"/>

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 :)

Mange tak for hjælpen.

stefan_v
Avatar billede snepnet Nybegynder
30. august 2004 - 16:59 #10
svar :o)
Avatar billede snepnet Nybegynder
30. august 2004 - 17:00 #11
det var en fornøjelse
mvh
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester