torsdag den 29. januar 2015

Repeater vil ikke opdatere til ny værdi liste med DataBind (ASP.NET Webforms)


Jeg har en side (ASP.NET Webforms) hvor den sætter en liste med data til en repeater.
I _ItemDataBound() ændres navnene fordi de skal have specielle værdier i. Jeg burde faktisk gøre det anderledes, men mere om det i et andet indlæg.
Når man så forsøger at registrere en ydelse med pris 0 skal den returnere et script der giver en popup der spørg om du vil opdatere med 0 fordi de vil blive automatisk fjernet.

Problemet er så at fordi jeg ændrer navnene på kontrollerne så virker viewstate ikke når den kommer tilbage (den kan ikke mappe chkBox_53152, til Mine_priser_Form1_PageHeaderControl_pnlMinePriser_Checkbox53152 - det lange navn ASP.NET selv laver for alt - så den kommer ikke tilbage i repeateren).

Så i Load sættes der ALTID default listen (med det der er gemt før), fordi ellers kan den ikke finde noget i Repeateren fordi så har den ikke nogle item (Nok fordi den ikke kan mappe dem tilbage). Der laves både Datasource = liste og DataBind() for at Click kan finde forskelle i repeateren.
Efter load udføres Click hvori den finder ud af hvilke elementer der har forskelle. Disse ligges ind i listen så listen nu er med de opdaterede værdier fra repeateren og der sættes igen Datasource = liste og DataBind() på samme repeater.

Når man så kommer til _ItemDataBound() så finder den de oprindelige værdier (fordi de er binded første gang), selvom jeg senere har lavet en anden DataBind() med en anden Datasource.

Det var jo et stort problem, men viste sig at jeg kunne "cleare" det som er DataBind'et.

Ved at sige
repeater = new Repeater()
repeater.Datasource = newList
repeater.DataBind()

så kan man få den nye liste igennem.

For mig er det underligt at den ikke overskriver det som er databinded tidligere, fordi du er jo ikke kommet til render endnu og derfor kan nå at ændre tingene, men åbenbart kun hvis man "clearer" det som er DataBind'et.

Så husk at du kan sætte din repeater til at være en ny, og den vil dermed glemme alt du har binded (VB.NET) på den, og så sætte den til det nye så virker det.

Ingen kommentarer:

Send en kommentar

Kan du lide mit indlæg, har en kommentar, forslag eller andet på hjerte så skriv venligst