16. oktober 2007 - 11:44Der er
9 kommentarer og 1 løsning
tilgå underliggende data i en GridIViewRow
Jeg har en underliggende sorteringsrækkefølge i de data, som jeg viser i mit GridView. Jeg henter sorteringsrækkefølgen ind via ObjectDataSource, og putter den ind i en kolonne, hvor jeg sætter Visible=false, så brugeren ikke kan se den.
Jeg vil så lade brugeren flytte en række, så jeg har brug for at ændre feltet med sorteringsrækkefølgen, og så opdatere rækken ned til databasen. Problemet er, at jeg kun kan få det til at virke, hvis jeg lader den usynlige sorteringsrækkeølge være synlig som en kolonne....
I øjeblikket kan jeg gøre således for at finde et sorteringsnummer (Om kolonnen er Visible eller ej gør ingen forskel): Single low = Convert.ToSingle(((Label)GridView1.Rows[placeBeforeRow - 1].FindControl("LabelSorternummer")).Text);
... men hvis jeg så ændrer teksten i LabelSorternummer og prøver GridView.Update(rownumer, false), så får jeg kun LabelSortnummer med i UpdateParameters, hvis kolonnen er Visible.
Så jeg ville lave en update-metode som bypasser ObjectDataSourcen, men her er så problemet: Hvordan får jeg fat i de underliggende data for hver GridViewRow uden at skulle hente dem via de kontroller, som de bor i i GridViewet?
Ja, det har jeg også prøvet, så hvad gør jeg forkert? Eller sagt på en anden måde, hvad er den korrekte måde at programmatisk ændre værdien i et felt i en række, og derefter update?
DataKeyNames indeholder "primærnøgler" som læst fra data, og man kan næppe ændre på dem.
Du kunne prøve et andet trick:
Lav en af de andre kolonner, ligegldig hvilken, om til TemplateField.
I dette TemplateField har du så det felt som der nu var oprindeligt, og tilføjer dit LabelSorternummer felt, blot med .Visible=False for den label værdien er gemt i. Mon ikke dette burde virke ?
??? ikke forstået. Skulle man tilføje en kontrol i en anden kolonnne end der, hvor den hører til? Deklarativt? Eller metoden som ændrer sorteringsnummeret?
Skulle det være for at omgås det problem, du omtaler med at DataKeyNames ikke kan ændres?
Hvad med ObjectDataSource.OnUpdating? Jeg tænkte om man ikke kunne bruge den på en aller anden måde? Her kan man jo tilgå og ændre UpdateParameters. Men hvordan får man kommunikeret hvilken række der skal ændres til hvad?
Du kan sikkert lave noget med don obejct datasource, men det er da i mine øjne lidt besværligt.
Dit problem ligger i, at hvis du har en hel kolonne du har sat til visible=false, så bliver den vist ikke bundet til dataene eller i hvertfald ikke tilgængelig når .Update køres. Eftersom det gælder om at have værdier i din "LabelSorterNummer", og de alligevel ikke skal vises for brugeren, så er der ingen lov der siger at den label skal sidde i sin egen kolonne. For at få værdier ind i den, og kunne læse den igen, så kan du blot lægge den i et template field delt med en anden værdi. I første omgang kan du lade den forblive .Visible=True, og når det virker så sætte .Visible=False.
Jep, det hjalp på det. Så hele problemet er, at man ikke skal skjule kolonnen men kun den label eller whatever man lægger værdien i? Det prøver jeg lige!
Jeg er sikker på at der er et eller andet rammende ordsprog for den situation, hvor man har været en hel masse omveje for at løse noget, og så er løsningen lige for næsen på en, og meget simpel. Det ville jeg så have skrevet her.
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.