Avatar billede nielsbrinch Nybegynder
07. februar 2005 - 14:49 Der er 4 kommentarer og
1 løsning

Forvirrelse omkring brug af ViewState

Jeg har et typisk scenarie der gentager sig.

Jeg har en ArrayList med objekter. Dette ArrayList sætter jeg som DataSource på en DataList og alt er som det skal være.

Når jeg fanger en event på min DataList, f.eks. ItemCommand, vil jeg gerne have fat i det objekt som der blev klikket på. Jeg vil altså ikke have selve DataList-item'en, men jeg vil have det oprindelige objekt som min DataList-item er baseret på.

Jeg forsøger at læse DataItem på men DataList-item - det burde give det rigtige resultat - men den er tilsyneladende altid 'null', med mindre jeg gen-initialiserer min datalist ved hvert postback.

Det kan da ikke passe jeg skal initialisere min DataList ved hvert PostBack, vel? Jeg vil undgå at lægge min oprindelige ArrayList i Session, og jeg synes heller ikke det virker som en god løsning at lægge den i en særskilt ViewState.

Hvad er den "rigtige" måde at løse dette scenarie på?
Avatar billede cms Nybegynder
07. februar 2005 - 16:41 #1
Et gæt er følgende:

public void Page_Load(object sender, EventArgs e)
{
  ArrayList myList = new ArrayList();

  //fill myList
  //...
  myList.Add( ... );

  //Assign datasource 
  myDataList.DataSource = myList;
 
  if (!IsPostBack)
    myDataList.DataBind();
}

Altså at du husker at lave dit array hver gang, og sætter DataList.DataSource.
Jeg kunne forestille mig, at du har gjort noget ala:

  if (!IsPostBack)
  {
    ArrayList myList = new ArrayList();

    //fill myList
    //...
    myList.Add( ... );

    //Assign datasource 
    myDataList.DataSource = myList;
 
    myDataList.DataBind();
  }

Et løst gæt, som ikke er afprøvet :)
Avatar billede snepnet Nybegynder
07. februar 2005 - 17:26 #2
hej niels :o)

jeg ved ikke om man kan sige at der er en rigtig løsning på det .... det er lidt afhængig af hvad det er du ønsker at gøre med dit dataitem.

som du selv er inde på, skal du hente data og databinde hver gang, hvis dit dataitem skal være til rådighed i en handler af ItemCommand ell.

viewstate synes jeg ikke du skal bruge .... for det første vil du få den øgede overførselstid, og for det andet skal serveren bruge en hel del ressourcer på at proccesere dit viewstate - performancemæssigt er der ubetinget den mindst attraktive løsning.

hvis du lægger din arraylist i session kan du altid få fat i de data der vedrører den enkelte række ved et simpelt opslag... nu ved jeg ikke hvad det er for objekter du lægger i din arraylist - men hvis det er noget du oprindeligt har hevet op af en database eller lign. har du jo også muligheden for at oprette dig en enkelt forekomst (af det du nu måtte have i listen) pr. et eller andet id (du så gerne skulle have til rådighed på dit repeateritem).

er der nogen særlig grund til at du ikke vil lægge det i session ?

hvis du gider skrive et par ekstra ord om hvad det er du gerne vil gøre med dit dataitem efterfølgende - og om det kan være tilfældet at der skal ske en "revers databinding" for mere end den række du har fået eventet fra - ville det være fedt.

valget mellem det ene og det andet vil jo typisk være udfra en vurdering af "prisen" for at gemme det i session - kontra "prisen" for at initialisere det hver gang.
jeg tror det er sjældent at det kan betale sig at initalisere hver gang (hvis du altså initialiserer med data fra en database eller lignenden eksterne ressource... ramklodser koster jo ikke noget - så lidt brug af session synes jeg da er acceptabelt.

mvh
Avatar billede nielsbrinch Nybegynder
08. februar 2005 - 08:12 #3
Mange tak snepnet, det giver fint overblik - jeg troede der var en elegant måde at gøre det på. I mit tilfælde, er det et ret dyrt kald, at populere datalisten, så det ender såmænd nok med jeg lægger det i session.
Avatar billede nielsbrinch Nybegynder
08. februar 2005 - 08:24 #4
cms, jeg tror jeg du misforstod hvad spørgsmålet egentligt handlede om. Men du kan læse det under snepnets kommentar, for han ramte plet.

snepnet, luk spørgsmålet.
Avatar billede snepnet Nybegynder
08. februar 2005 - 20:54 #5
jamen du får et svar så :o)
held og lykke med det.
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