torsdag, augusti 26, 2010

Repeaters pt. 2

Jo, jag kom på en till sak som man ofta ser mycket felaktig information om. Nämligen att det går inte att hämta värden ur repeaters.

Till exempel, man har en repeater med en textbox. Du säger id="foo", och repeatern rasslar till och du har 20st foo. Givetvis kan du då inte i code-behind köra på som vanligt.

Knepet är att använda sig utav FindControl.

for(int i = 0; i < repeater.Items.Count; i++)
{
TextBox tb = repeater.Items[i].FindControl("foo");
string foobar = tb.Text + i;

Där har du då din textboxkontroll samt nummer på repeatern den kom ifrån. Mycket enkelt. Går att tillämpa på alla möjliga slags kontrollers, checkboxar etc.

onsdag, augusti 25, 2010

Repeaters

Det står mycket blaj om repeaters (asp) på nätet alltså, folk har verkligen ingen koll.

För det första så finns det ingen anledning att köra Eval() när man kan casta direkt till objektet man bindat mot. Varför svänga förbi eval som dessutom använder sig utav reflection (kostsamt) när man kan använda objektet rakt av? Begriper inte det.

<%# Server.HtmlEncode(((verifiable)Container.DataItem).display) %>

Lätt som en plätt.
En annan sak folk inte verkar fatta är att man kan ha nested repeaters. En repeater inuti en repeater alltså. Så om man har en lista, med en klass, och klassen innehåller en annan lista. 

Så är det bara peka datasource mot listan i den djupare nivån!

asp:Repeater ID="rptInv" runat="server" DataSource="<%# ((verifiable)Container.DataItem).comp %>"
Lätt som en plätt!

Till sist, så kan man i den djupare repeatern komma åt saker i den övre, parent repeatern. Verkar som att ingen fattat det heller, och gör märkliga lösningar med literals och diverse fulhack. Men varför krångla till det, när man kan använda sig utav .Parent. 

<%# ((verifiable)((RepeaterItem)Container.Parent.Parent).DataItem).id%> 

Inget mystiskt där heller. Förutom att du får en RepeaterItem genom Parent, inte själva objektet.

Det var allt för denhär gången.