webForumDet fria alternativet

Nå property med lazyload i GridView

.NET

6 svar · 406 visningar · startad av erka

Medlem sedan dec. 19996 522 inlägg
Frågan#1

Hej
Jag har tänkt att visa lite data i en gridview, datat som ska bindas är en generic collection med objekt av en viss typ.

I gridview kan man ju om man använder sig av propertys göra på följande sätt

 <asp:BoundField HeaderText="Namn" DataField="Name" SortExpression="Name" >
            <HeaderStyle BackColor="#9D5C4F" ForeColor="White" HorizontalAlign="Left" />
        </asp:BoundField>

Där Name är en property i mina instansierade objekt i min collection. Problemet blir om jag har en property som kör med lazyload, låt oss säga att jag har en property som heter OrderAdress och den i sin tur refererar till ett objekt av Adress-typ som laddas när man anropar propertyns get-metod. Vill jag ha ut propertyn Street som finns i OrderAdress kan jag inte heller nå den via skriva DataField="OrderAdress.Street". Så min fråga är hur jag ska lösa detta på bästa sätt?

Antingen sköta det i codebehind och hur gör jag då på bästa sätt, eller skriva om min klass så att ett objekt som collectionen innehåller även håller adress direkt under klassen och inte någon referens till en annan klass. Åsikter?

Medlem sedan dec. 19996 522 inlägg
#2

Har testat nu och det smidigare jag kommit på är att skapa ett datatable, lägga till lite kolumner som jag vill visa, loopa igenom min collection och fylla datatable med information från den, sen binda datatablen till gridview istället för min collection, men det känns lite omständigt, men kanske så man får göra.

Medlem sedan dec. 19996 721 inlägg
#3

Om du använder ett BoundField så kan du inte komma åt subproperties (kasst), så du får använda ett TemplateField i stället, där du kan plocka ut egenskapen. Hårt typad, eller via Eval.

Medlem sedan dec. 19996 522 inlägg
#4

Tack emission, menar du att subproperties är kasst eller att man inte kan nå dem via boundfield :)

Medlem sedan dec. 19996 721 inlägg
#5

Att man inte kan nå dem. Det finns ingen försvarbar anledning (har kollat koden bakom) till att det inte skulle gå. Det borde dock inte vara så svårt att skriva en egen BoundField (ärva från originalet) som har en smartare implementering av GetValue-metoden.

Medlem sedan dec. 19996 522 inlägg
#6

Ok, rent prestandamässigt, det är ju enklare rent underhållsmässigt å köra på eval, men prestandamässigt , är det slöare å nå dem via eval och late binding än att att loppa igenom collectionen och slänga in det i ett datatable

Medlem sedan dec. 19996 721 inlägg
#7

Den generella rekommendationen är att man undviker Eval, eftersom den använder Reflection i bakgrunden (det gör DataField också, men inte alls lika intensivt), men i de prestandatester jag gjort har prestandaförlusten oftast varit försumbar, förvånande nog. Att loopa igenom collectionen och slänga in den i ett datatable borde innebära en rätt rejäl prestandaförlust, och dessutom blir det en väl knepig manöver.

295 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
165 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)