26. november 2008 - 11:45Der er
8 kommentarer og 2 løsninger
Sende flere værdier til dynamisk oprettet button
Jeg har en button som bliver oprettet dynamisk og så adder jeg en eventhandler.
Så kan jeg bruge button.CommandArgument til at sende en værdi til knappen, men jeg har brug for at kunne sende flere værdier (4 for at være helt præcis) eller endnu bedre kunne sende et object med.
Mit problem er at jeg har brug for at knappen kalder en metode som indsætter data i en database og til det skal jeg bruge de værdi som indgår i primary key.
Kan du forklare lidt bedre, hvad du mener med at du kan tilgå objektet i page_load, men ikke i button_click? Er det i samme postback at der er forskel på om du kan loade objektet fra page_load eller button_click? Hvordan har du referencen til objektet liggende?
I page_load har vi en liste af objekter som vi henter fra databasen.
Vi itererer listen med en foreach og tilføjer nogle buttons osv til en placeholder. Dvs hvis vi har 4 objekter i listen får vi 4 gange de buttons på siden.
Hver af disse buttons får en eventhandler som kalder en metode. Det er i denne metode vi vil have fat i det objekt i listen som de buttons blev lavet udfra.
Vi kan godt hente dette objekt igen fra databasen vha. kalps løsning, men dette betyder så at vi hente det samme data 2 gange fra databasen, hvilket vi vil undgå.
Det kan gøres på 2 måder. ViewState eller Session.
Med ViewState metoden bliver objekterne serialiseret og sendt med til klienten.
Med Session metoden, bliver objekterne husket på i hukkomelsen på serveren.
Begge metoder har ulemper og fordele. Session vil gå hurtigere, da objekterne ikke skal serialiseres og sendes til klienten. Session metoden kan dog give problemer, hvis du har mange brugere, da hukommelsen på serveren bliver fyldt op. ViewState bruger ingen hukommelse på serveren, men bliver tung hvis der skal sendes mange data.
protected Dictionary<string,MyClass> MyObjects { get { return ViewState["MyObjects"] as Dictionary<string,string>; } set { ViewState["MyObjects"] = value; } }
Når du dynamisk opretter dine knapper, skal du ikke bruge CommandArgument, men i stedet tilføje det tilhørende objekt til MyObjects. Husk at give knappen en unik ID.
MyObjecys.Add(myNewButton.ID, myObject);
på din button_click event handler, får du fat i knappens tilhørende objekt på følgende måde:
Session gøres på samme måde. Bare skift ViewState ud med Session.
...og et svar :-)
Bare spørg, hvis du får problemer med det.
PS. hvis det er et stort objekt der er snak om, kan det nok betale sig at hente det op fra databasen hver gang det skal bruges.
Synes godt om
Ny brugerNybegynder
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.