webForumDet fria alternativet

ItemDataBound på Repeater...

.NET

10 svar · 446 visningar · startad av fredrik

Medlem sedan dec. 19991 072 inlägg
Frågan#1

Jag har en repeater med en "child"-repeater i dess <itemTemplate>.

Hur gör jag för att trigga OnItemDataBound på ChildRepeatern?

'Körs i ItemDataBound på den första Repeatern
AddHandler CType(e.Item.FindControl("repChild"), Repeater).ItemDataBound, AddressOf MY_METHOD

Ovanstående funkar inte...

Det funkar däremot om jag själv sätter "OnItemDataBound" på ChildRepeatern i HTML-läget, men nånstans ringer en klocka om att det är sämre...

Medlem sedan maj 20012 812 inlägg
#2

nu kan jag inte VB.NET men den koden ser mer ut som att du binder en funktion till eventet än att du triggar det?

Vilket är det du vill göra? Trigga eventet är ju lite överflödigt då det triggas av sig själv så fort du gör en DataBind() på repeatern.

- M

Medlem sedan dec. 19991 072 inlägg
#3

Nä...nu har jag antingen förklarat för dåligt, eller så har du inte hängt med! :)

1. Jag har en Repeater, och i den har jag ytterligare en repeater (ChildRepeater).

2. När jag med ItemDataBound sätter värderna i huvudrepeatern så sätter jag även datasource på ChildRepeatern och gör DataBind() på den.

3. Nu när Childrepeatern binds så vill jag sätta dess värden i dess ItemDataBound, men det finns ju ingen metod associerad med den händelsen. Så vad jag försökte göra i koden ovanför var att tilldela en händelsehanterare till dess "ItemDataBound" (Det är annars rätt syntax för VB.NET).
MEN, den tar inte den.

Om jag däremot på Childrepeatern själv i HTML-läget sätter:
OnItemDataBound="repResult1Detail_ItemDataBound"

Så funkar allt. Men jag vill sätta det i kodläget istället.

Hoppas det blev klarare nu!

Medlem sedan maj 20012 812 inlägg
#4

Okej, du vill binda en function till eventet och inte trigga det.

Det spelar ingen roll om du gör det i HTML-koden eller i VB-koden båda sätt är lika bra/dåliga.

Det fungerar att binda det i koden, därför vore det intressant att se hur din ItemDataBound function för main repeatern ser ut.

följande fungerar bra (C#):

			if(repeaterItemEventArgs.Item.ItemType == ListItemType.Item)
			{
				Repeater oRepeater = (Repeater) repeaterItemEventArgs.Item.FindControl("Repeater2");
				oRepeater.ItemDataBound += new RepeaterItemEventHandler(Repeater2_onItemDataBound);

				oRepeater.DataSource = list2;
				oRepeater.DataBind();
			}

Testade precis och functionen Repeater2_onItemDataBound kallas precis som den skall.

- M

Medlem sedan dec. 19991 072 inlägg
#5

Vad jag kan se så är det samma som jag har gjort, fast mitt är i VB.NET...

        If e.Item.ItemType = ListItemType.AlternatingItem Or e.Item.ItemType = ListItemType.Item Then

            'GET PRICE DATA
            With CType(e.Item.FindControl("repResult1Detail"), Repeater)
                .DataSource = NY_LISTA 
                .DataBind()
            End With
        End If

Det funkar som sagt klockrent om jag sätter det i HTML-koden. Men jag har för mig att det är sämre för prestandan, då den nu måste verifiera metodnamnet och använda Reflection för att binda metoden till händelsen....

Medlem sedan maj 20012 812 inlägg
#6

I den koden som du har skrivit så har du inte bundet någon metod till ditt event. Men du har kanske utlämnat en del.

Har inte för mig att du måste använda reflection för att få binda metoden till eventet via HTML.

- M

Medlem sedan dec. 19991 072 inlägg
#7

Nej, det stämmer, koden ovan är bara hur ChildRepeaterns datakälla sätts. Det är koden från post 1 som tidigare även låg där. Alltså:

AddHandler CType(e.Item.FindControl("repChild"), Repeater).ItemDataBound, AddressOf MY_METHOD
Medlem sedan maj 20012 812 inlägg
#8

Kan du inte skicka med hela koden för mainrepeatern ItemDataBound eventet.

- M

Medlem sedan dec. 19991 072 inlägg
#9

Hela koden är alltså:

If e.Item.ItemType = ListItemType.AlternatingItem Or e.Item.ItemType = ListItemType.Item Then

            'GET PRICE DATA
            With CType(e.Item.FindControl("repResult1Detail"), Repeater)
                .DataSource = NY_LISTA 
                .DataBind()
            End With

AddHandler CType(e.Item.FindControl("repChild"), Repeater).ItemDataBound, AddressOf MY_METHOD

        End If
Medlem sedan maj 20012 812 inlägg
#10

Okej, det fungerar inte för att du binder din funktion till ditt event EFTER att du har gjort DataBind().

Flytta upp din AddHandler. Innan du gör din With sats så kommer det funger.

- M

Medlem sedan dec. 19991 072 inlägg
#11

Japp, tackar för det. Det funkar.

När man tänker efter är det ju ganska logiskt, eftersom den redan var bunden när jag tilldelade dess händelsehanterare.

Tack!

259 ms totalt · 4 externa anrop · v20260731065814-full.e96017d9
120 ms — deklarationer (db)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)