Hej Gus, En liten fråga. mrWize. Jaha. Svaret på hur jag ville att det skulle fungera hade jag från början, men jag saknade lite saker i datalisten. Någon dag kanske man skriver sig en egen om man får tid. Appropå att använda tex "ItemDataBound" för att där lägga in data. Fredrik. Fredrik. Jag håller med Johan. Har tyvärr inte någon länk. Johan: Fredrik, <b>Det beror väl på vad du har för användning av det. Att köra kod i eventet för att sägga in data kan ta mycket mer kraft än att använda Eval hanteringen</b> Johan: Andreas Fredrik, Johan, Andreas. Johan, Andreas. Johan, Andreas, För att inte göra detta till en långkörare i episka proportioner, när kör man ItemDataBound utan att behöva använda FindControl ? =) Jag och johan snackade vidare om detta utanför pellesoft och enades någerlunda. Gjorde en preliminär test på att hämta information från Northwinds produkt tabell (+ joins på Catagories och Suppliers) sen att lista dem i vers en DataList med hjälp av ItemDataBound och Eval. För att ytterligare krångla till dig vill jag länka till en sida med prestandatips där det står följande: Patrik. Hur skulle det vara med en "egen" förenklad FindControl? typ där man loopar igenom e.item.Controls och kollar om ID.t stämmer med det man letar efter? Fredrik, *suck* Johan den sekunden du läggen in en Eval förlorar du även design-möjligheterna .. för många är just design möjligheterna RAD verktyget och Eval extra godis.. det beror från fall till fall .. Eval .. trodde vi hade kommit fram till att ItemDataBound inte alls är en elak bov om man inte använder FindControl - som man enbart är i behov av när man har ett dynamiskt antal kolumnet och då funkar inte Eval iheller. Johan: Fredik, Andreas... Johan, Fredrik. Andreas.IF-sats i datalist/repeater
Kan man i en datalist/repeater ha en IF-sats?
Typexemplet är ju <%# DataBinder.Eval(Container.DataItem, "mittvärde") %> för att skriva ut "mittvärde", man kan ju även anropa funktioner i code-behind och det returnerade värdet skrivs ut (<%#GetTheStuffyStuff(Container.DataItem)%>). Men kan jag direkt i .aspx-filen göra en IF sats? Tex
<code>
<%if DataBinder.Eval(Container.DataItem, "mittvärde") <> "EttAnnatKulVärde" then
end if%>
</code>
eller
<code>
<%# if DataBinder.Eval(Container.DataItem, "mittvärde") <> "EttAnnatKulVärde" then
end if%>
</code>
Saken är den att beroende på ett visst värde i listan i Datalist/repeatern så vill jag göra lite olika saker. Eller blir man tvungen att bygga en egen repeaterkontroll?
Mvh
/GusSv: IF-sats i datalist/repeater
Vad du kan göra är att du ropar på en metod som gör det du vill göra. Blir i mina ögon stiligare då.
Du kan från Repeterns ropa på metoder.
<code>
<%# PlockaMittVärde(DataBinder.Eval(Container.DataItem, "mittvärde")) %>
</code>
Code behind eller scritpblock i Aspx filen.
<code>
public string PlockaMittVärde(string value)
{
if ( value == "Hej" )
return ( "Haha" );
else
return ( "Muhahah" );
}
</code>
Mvh JohanSv: IF-sats i datalist/repeater
Ska man inte försöka komma ifrån det där med DataBinder.Eval(Container.DataItem ...... osv
Har hört, och använder endast, att OnItemDataBound eventet för DataGrid, DataList, Repeater osv.
Litet exempel (fulkodat):
<code><%@ Page Language="VB" %>
<script runat="server">
Public Sub Page_Load(Sender As object, E As EventArgs)
Dim _vals As String() = {"hej", "åh", "hå"}
Repeater1.DataSource = _vals
Repeater1.DataBind()
End Sub
Public Sub Repeater1_DataBound(Sender As Object, E As RepeaterItemEventArgs)
Select Case e.Item.ItemType
Case ListItemType.Item, ListItemType.AlternatingItem
Dim _val = CType(e.Item.DataItem, String)
Dim _lbl As Label = e.Item.FindControl("lbl")
If (Not _lbl Is Nothing) Then
If (_val = "åh") Then
_lbl.Text = "JAAAAAA!!!!<br>"
Else
_lbl.Text = "NEEEEEEEJJ!!!!!<br>"
End If
End If
End Select
End Sub
</script>
<html>
<head>
</head>
<body>
<form runat="server">
<asp:Repeater id="Repeater1" runat="server" OnItemDataBound="Repeater1_DataBound">
<ItemTemplate>
<asp:Label id="lbl" runat="server"></asp:Label>
</ItemTemplate>
</asp:Repeater>
</form>
</body>
</html>
</code>
eller är jag helt ute och cyklar?
cya,
/PatrikBSv: IF-sats i datalist/repeater
Det beror väl på vad du har för användning av det. Att köra kod i eventet för att sägga in data kan ta mycket mer kraft än att använda Eval hanteringen i ASP .Net 2 blir det to m. ännu lättare där kan du ange Eval med en gång och behöver inte använda DataBinder då det sker implicit.
<code>
<%# Eval("CustomerID") %>
</code>
Vet ej vad du fått din idé från att man inte skall nyttja databinding. har du länk eller argument varför?
För vad jag vet finns det inget sådant sagt.
Mvh JohanSv: IF-sats i datalist/repeater
<b>< Vad du kan göra är att du ropar på en metod som gör det du vill göra. Blir i mina ögon stiligare då. </b>
Hej
Det var prexis det jag menade med <%#GetTheStuffyStuff(Container.DataItem)%>. Men i just det jag skall ha gjort nu så är det lite mer komplicerat än att returnera en text, utan även htmlkod skall skrivas ut beroende på vad värdet är. Värdet i sig är en bool så jag vet ju om det skall skrivas ut elller inte.
Dvs
<code>
public string PlockaMittVärde(string value)
{
if ( value == "Hej" )
return ( "<tr class="hahaklassen"><td width="666">Haha och gör lite mer</td></tr>och kanske ett javscript eller tre" );
else
return ( "<tr class="muhahaklassen"><td width="999">Muhahah</td></tr>" );
}
</code>
En tänkbar lösning kan ju kanske vara att se om man inte kan lägga en Panel i datalist/repeatern och sätta visible på den beroende på vad värdet är. Undersöker det nu....Sv: IF-sats i datalist/repeater
Hum du kan ju lösa det på lite olika sätt, antingen som jag trro du sa skapa en egen kontroll som du lägger till på sidan som tar emot ett värde som attribut som i sin tur sedan renderar ut html eller html kontroller. Eller så gör du som du typ gjort nu där du renderar ut html men tar input som bool. Du kan to m. ge en control som retur om du vill.
Gör så här, skriv ner på papper vad du är ute efter, rita upp 3 olika lösningar, de 3 första du kan komma på (om du inte direkt kommer på den lösning du vill nyttja.) tänk o se vilken som ser snyggast ut och ger dig flest fördelar. Punkter som. Förändringbart, vad händer om jag måste lägga till mer html? vad händer om jag måste byta utseende på htmlen m.m. ja allt möjligt. När du vet detta kommer du bergis ha ett svar hur du vill gå tillväga.
Mvh JohanSv: IF-sats i datalist/repeater
Sättet jag gjorde det på är inte det snyggaste eller bästa men just nu i den tidspress jag har så får det var så. I min datalist/repeater har jag en panel deklarerade så här
<code>
<asp:Panel runat="server" Visible="<%# SetHeaderValueBool(Container.DataItem)%>">AndDoTheFunkyStuffHere</asp:Panel>
</code>
och funktionen
<code>
Public Function SetHeaderValueBool(ByVal obj As Object) As Boolean
Dim drv As DataRowView = CType(obj, DataRowView)
If CInt(drv.Item("mittvärde")) <> ettannatvärde Then
Return True
Else
Return False
End If
End Function
</code>
Inte snyggast, men funkar...
Tack så mycket för svaren.Sv: IF-sats i datalist/repeater
Jag har också läst att det ska vara snabbare att lägga in data via eventen är att använda databindningen direkt i HTML-koden.
Själv föredrar jag även "Event"-förfarandet då det ger (enligt mig) snyggare kod och ökad läsbarhet. Man slipper även att en "typ-konvertering" görs (m Reflection?) vid varje bindning. Ta följande lista som binds mot en Repeater tex.:
myList.add(new DataType(1, "Dell"))
myList.add(new DataType(2, "Compaq"))
I mitt event behöver jag ju nu bara göra:
Dim MyDataType = Ctype(e.Item.DataItem, DataType)
ctype(e.item.findControl("litBrand"), literal).text = MyDataType.Brand
För att komma åt och hantera dess data. Ovanstående kräver ju dock en typ-konvert. för att hämta kontrolltypen, vilket är dess nackdel.
Om detta istället skulle göras vid direkt-bindning, antar jag att en Reflection-operation krävs för varje fält. Ska man dessutom använda en viss överlagrad "ToString()" för tex datum måste ytterligare en typ-konvertering göras.
Istället för Eval() kan ju även en typ-konvertering göras direkt via html-kod med:
<%# CType(Container.DataItem, System.Data.DataRowView)("au_id") %>
Enligt denna artikel: http://support.microsoft.com/default.aspx?kbid=307860&product=aspnet#4c står det:
"Explicit Casting
If you need more control, use explicit casting. An explicit conversion uses a type conversion keyword. These keywords act as functions, but the compiler generates the code inline. Therefore, execution is slightly faster than with a function call."
Då borde det rimligtvis vara ännu snabbare att göra bara en typ-konv/rad själv.
...eller? :)
/FredrikSv: IF-sats i datalist/repeater
Denna borde du oroa dig för istället:
<code>
e.item.findControl("litBrand"),
</code>
Här lletar du genom en collection. Först tar du e och sedan dess objektdata därefter en metod i den och letar fram en post för varje bindning. Sedan kastar du om den. Det som händer vid Eval är att du tar nästa post kollar dess typ och den konverteras tyl till string eller liknande. Du slipper för varje lad loopa genom en collection av data.
Jag anser att det är snyggare att göra eval i på aspx sidan än i en evetnmedot. Tycker inte din kod är lättare att förstå än om du direkt körde eval. Nu måste du ju ange en kontroll som du måste leta efter, tänk om du måste ändra dess ID? då måste du ändra i din kod oxå.
Dock är det mesta rätt relevant, man gör det som kraven ställer på bästa sätt. Så inget av fallen är felaktiga. Tänk oxå på att oftast kostar en utvecklar eme ri tid att skriva kod än öka prestanda med hårdvara... I de fall du funderar på prestandan före effektiviteten och vinsten.
Mvh JohanSv: IF-sats i datalist/repeater
Så här fungerar det.
FindControl:
Först kommer den att kolla så alla Child kontroller finns detta gör den med
this.EnsureChildControls();
Sedan körs en koll om kontrollen i sig har kontroller:
this.HasControls()
som i sin tur gör en Count för att se om det finns eller ej.
Om det är sant kör den
this.EnsureNamedControlsTable();
Som i sin tur bygger upp en tabel med HybridDictionary.
Sedan byggs det upp en ID hanterare för att senare användas.
Detta görs genom en Char array.
När detta är gjort kommer den att köra en IndexOfAny...
och om resultatet där skulle vara -1 körs den en substring för att få fram en key för att sedan plocka ut kontrollen ur en OccasionalFiled klass som i sin tur har en hel del logik.
Om kontrollen inte hittas kör den metoden igen tills det är funnen eller ej. (Rekursivt anrop)
Sedan castar du oftast om denna kontrol till dess egen.
Eval hanteraren kommer köra som du säger med reflection för att plocka ut dess property och returnera objekt. Här händer en hel del tevliga saker. Beror på dess container och expression.
Vilket sätt som är snabbast, kan jag inte dirket svara på, men det hela baseras högst troligt på hur mkt data det är m.m. Men som sagt findControl är inte snäll... Den tar väldigt mkt kräm. Så vad du läst detta har jag ingen aning om.
Men som sagt det är utv-tiden som kostar och oftast inte prestandan, alltid billigare att skal ut eller upp.
Mvh JohanSv: IF-sats i datalist/repeater
Den "casting" som sker vid DataBinder.Eval är minimal jämfört med overheaden att leta upp en kontroll med Control.FindControl och sedan göra en explicit cast.
Man märker ganska omgående att om du slår på OnItemDataBound så sänker du prestandan på dina datakontroller. Titta tex med Application Test Center (HOMER) kör requests och du ser en enorm skillnad.Sv: IF-sats i datalist/repeater
Detta var för 1 - 1.5 år sedan som jag läste det någonstans, och jag tror att det var på www.asp.net forumet, eller en artikel som "publicerats" där.
Nu vart jag lite orolig, då jag från början använde DataBinder.Eval(), men ändrade om till OnItemDataBound efter att jag läst om det, gjorde diverse "mindre tester", dock ej med Application Test Center :(
Blir till att labba lite mer, sätta upp ett par requests och kanske omvärdera :o .... för framtida kod ;P
cya,
/PatrikBSv: IF-sats i datalist/repeater
Intressant läsning! Måste bara fråga...Var har du hittat informationen nånstans?
Är dock fortfarande tveksam till just "eval", skulle hellre (vid bindning direkt i sidan) använda:
<%# CType(Container.DataItem, System.Data.DataRowView)("au_id") %>
Får helt enkelt prova lite tyngre tester och se hur resultatet blir, både vid många och få kolumner.Sv: IF-sats i datalist/repeater
Genom att komma vad den gjorde.
Säg gärna till när du gjort lite testar och publicera gärna resultatet, alltid intressant.
Nu skall jag dra mig hemmåt, helt slut... skänt med helg.
Mvh JohanSv: IF-sats i datalist/repeater
Varför? Jag skulle tippa på att <b>Eval</b> använder sig av reflection vilket inte skulle göra den till den snabbaste funktionen som finns precis. Sv: IF-sats i datalist/repeater
"Genom att komma vad den gjorde.", antar att du menar "kunna", men exakt var har du läst eller hört det? Jag betvivlar alltså inte att det stämmer utan undrar var man hittar sådan information (har sökt och läst om det utan att hitta just så specifik information).
/FredrikSv: IF-sats i datalist/repeater
läs mitt inlägg ovan där jag beskriver kort hur de fungerar, Ja den använder reflection men det är skillnad på late binding för varje kolumn plus rekursiva sökningar i collections vs att nyttja Eval...
mvh JohanSv: IF-sats i datalist/repeater
Jag kollade genom koden för att se vad den gjorde. Det finns apps som exempelvis kollar hur lång tid varje metod i en metod tar på sig att utföra. QA Time är ett sådant program, kostar dock pengar :-(
Mvh JohanSv: IF-sats i datalist/repeater
Umm om man använder ItemDataBound så vare sig använder man rekursiva sökningar i collections eller late-bindar för varje kolumn. Man binder sin data-källa som vanligt och sen använder man den explicit från ItemDataBound händelsen för att slå upp information med hjälp av t.ex e.Item.ItemIndex.
Vistt kan man göra explicits anrop mot en annan data-källa i ItemDataBound men det är definitivt inte det vanligaste och i de fallen som man gör det så är det troligen för man behöver lite mer avancerad logik.Sv: IF-sats i datalist/repeater
"Umm om man använder ItemDataBound så vare sig använder man rekursiva sökningar i collections eller late-bindar för varje kolumn."
1... Late binding använder du då fu kör event...
2... Ang collection, sant men kolla koden så ser du att han säker med FindControl. det är den som kör via collection.
mvh JohanSv: IF-sats i datalist/repeater
På vilket sätt late-bindar man när man kör eventet? Eval är trevlig om man inte behöver någon som helst logik, eller vill kunna växla över till design läge på sidan. Vidare så funkar det perfekt att använda Eval från eventet.
Hur som helst så är det Eval som utnyttjar late-bidning. Microsoft var till och med så snälla så att de varnar för just detta i dokumentationen för Eval metoden
<info>
<b>CAUTION</b> Since this method performs late-bound evaluation, using reflection, at runtime, it can cause performance to noticeably slow compared to standard ASP.NET data-binding syntax. Use this method judiciously, particularly when string formatting is not required.
</info>
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwebuidatabinderclassevaltopic2.asp
Kan tillägga att "judiciously" betyder samma sak som "with care", till de av er som inte känner sig så bekväm med engelsk literatur.
- En trött andreas - =)Sv: IF-sats i datalist/repeater
Event körs under runtime, det blir late binding med de metoder den kör, exempelvis då du kör en metod när vajre rad skapas etc... Sedan så utför han fortfarande en FindControl som i sin tur rotar genom en collection som i sin tur bygger upp en tabelstruktur med collection som sedan bygger upp en char array för att plocka ut rätt ID sträng den sedan gör substring på etc.. Och FindControl är rekursiv vilket betyder att den letar ner i Kontrollerna... Därefter när man ev hittat sin kontroll utförs en cast, man plockar ut värdet gör nått kul.
Kär man mot en metod direkt från ASPXZ sidan där man plockar ut värdet med Eval så utförs det färre opperationer än lösningen ovan.
Ms har to m i ASP .Net 2.0 gjort syntaxen lättare. Troligen to m optimerat den lite.
Har inte gjort några prestanda tester mellan findcontrol och event lösningen vs ropa på medot och använd eval från ASPX sidan. Jag har heller inte tittat hur IL koden ser ut, hur mkt det blir optimerat för de två olika sätten.
Sedan det viktigaste.
Det är inte alltid prestandan som är viktigast, utan utvecklartiden man lägger ner, att ropa på ett event som i sin tur rotar genom kontrolhierarkin efter ett visst id som sedan skall kastas om som man sedan skall plocka ut värdet ur om det är den typ man letar efter och som sedan utför operationer tar mycket längre tid att skriva och underhålla än att skriva en metod som man sedan nyttjar direkt i templates på ASPX sidan. (Det var främst det som var mitt svar och syfte med hur jag rekommenderade honom att göra.) Sedan diskuterade vi dess skillnad i operationer och ev prestanda.
<info>
"This method offers a simpler syntax than standard data-binding syntax, making it easier to remember. To do so, you must place the <%# and %> tags, which are also used in standard ASP.NET data binding, around the data binding expression.
This method is particularly useful when data binding against controls that are in a templated list."
</info>
Jag skall till gymmet nu sedan ev frisbeegolfa lite, men nu börjar jag bli ottroligt nyfiken på att göra ett prestandatest. Tar nog och gör ett sen.
Mvh Johan Sv: IF-sats i datalist/repeater
Nu hänger jag inte riktig med på ditt resonnemang på late-bound events. Så för att ett event körs under runtime så skulle det vara late-bound? Late-binding innebär att man vid design (kompile) time inte kan avgöra på vilket objekt som något skall anropas (och ibland vad som skall anropas på objketet).
Att vid designtime explicit registrera en metod som en hanterare av ett event innebär att kompilatorn kan avgöra exakt på vilket objekt, och metod som skall anropas när eventet inträffar, dvs. den kan direkt ersätta det med en metodpekare.
Late-binding == Reflection i .NET och att redan vid designtime kunna skriva in exakt vilken metod på vilket objekt som skall anropas ger inget annat än early-binding?
Vidare så är juh inte FindControl rekursiv i heller, utan den letar enbart i kontroller som är direkt underordnade till det rootelement som du genomför sökningen på.
Vad jag finner mest spännande är nog att trots Microsofts tydliga varning om att just Eval använder sig av late-binding, som du säger är så farligt, och därför lider av prestandaproblem, speciellt vid stora mängder information, så hävdar du att använda ItemDataBound är långsammare mycket på grund av att det skulle innebära late-binding?
Eval använder onekligen sig av reflection, som du själv sagt, och då kommer juh även cast problem och otypade objekt med in i bilden, på vilket sätt skulle dessa skolja sig från en explicit cast på retur värdet på FindControl?
Info texten du klippte in säger absolut inget om prestanda, utan bara om att syntaxen är enkel att använda och att den är användbar när man använder templatade kontroller - det är det ingen som sagt att den inte är.
Är själv också lite intresserad av att sätta upp ett prestanda test så fort jag har tid - kan dock bli omfattande tester som krävs, med olika typer av datakällor och storlek på datamängder för att kunna bilda sig en korrekt uppfattning av beteendet på de olika metoderna.
Men att ItemDataBound skulle lida av så stora sviter och på så sätt vara långsammare / sämre köper jag inte när Eval definitvt är late-bound och själv använder sig av så många av de brister som hävdar att just ItemDataBound skulle ha.
Ang Eval i .NET 2.0 så kan jag inte uttala mig om hur prestandan i den är. En enklare syntax betyder oftare en mer komplex logik bakom - och de lä juh knappast ha trollat bort behovet av reflection precis.Sv: IF-sats i datalist/repeater
Men du lyssnar ju inte....
"så hävdar du att använda ItemDataBound är långsammare mycket på grund av att det skulle innebära late-binding?
" <--- Har jag inte sagt...
Eval lösningen är effektivare i utv-tid och något jag rekommenderar före att köra eventet och där i nyttja FindControl. Se koden killen skrivit det är den jag pratar om inte själva eventet vs Eval.
Om jag vart otydlig så ber jag om ursäkt, tycker jag sagt flera gånger att köra eventet och i den köra fincontrol med casting kräver mer än bara Eval.
"Vidare så är juh inte FindControl rekursiv i heller, utan den letar enbart i kontroller som är direkt underordnade till det rootelement som du genomför sökningen på."
Läste nog koden fel, dock körs findControl i flera ggr i FindControl men på dess namingcontainer etc...
Lite kod:
<code>
findcontrol..... i Control klassen...
...
if (!this.flags[128])
{
control1 = this.NamingContainer;
if (control1 != null)
{
return control1.FindControl(id, pathOffset);
}
return null;
}
...
Control control2 = (this._occasionalFields.NamedControls[text1] as Control);
if (control2 == null)
{
return null;
}
return control2.FindControl(id, (num1 + 1));
...
</code>
"Så för att ett event körs under runtime så skulle det vara late-bound? Late-binding innebär att man vid design (kompile) time inte kan avgöra på vilket objekt som något skall anropas (och ibland vad som skall anropas på objketet).
"
Njao, vad jag vet körs delegates (funktionspekare) under runtime det är först då den binds. Vilket jag fått för mig är late binding. "Sen bindning."
Så återigen rekommenderar jag Eval före att köra ItemBound där man nyttjar FIndControl metoden.
I det endamål han vill nyttja. Men vissa saker kan man inte göra direkt via Template koden och måste nyttja ItemBound, det kommer man inte undan.
Mvh JohanSv: IF-sats i datalist/repeater
Sv: IF-sats i datalist/repeater
Använde mig av att bara lista produkt namnet för båda, då det inte finns någon prestandafördel / nackdel att upprepa samma sak hela tiden om man ändå dividerar med faktorn. Mätningen är gjort på 1000 anrop till DataBinder() på de olika DataList kontrollerna och är mätta i Ticks.
* ItemDataBound - 31345
* DataBinder.Eval - 23533
Jag körde samma test flera gånger (a 1000 itterationer) och skillnaden mellan de två olika var i princip den samma hela tiden. Skillnaden mellan de olika är ca 1/4 konstand vilket inte är speciellt mycket med tanke på att man får tillgång till logik-stöd i ItemDataBound, samt att man kan växla till Design-läge.
DataBinder.Eval är ett bra RAD verktyg, som definitivt skall användas när det passar - använder det själv ganska ofta. ItemDataBound ger mer kontroll över den logik & regler som skall användas när informationen fylls i kontrollen.
För resonnemangets skull provade jag även att jämföra DataBinder.Eval mot att använda just denna metod inuti ItemDataBound händelsen (som datakälla med hjälp av e.Item.DataItem) och fick i princip identiska resultat
* ItemDataBound - 34249
* DataBinder.Eval - 22031
Skillnaden är inte så stor och en anledning till det är att jag i första testat givetvis hade optimerat så att jag inte behöva lyfta ut datakällan varje gång från DataList1.DataSource och typa den, utan hade en referens till den.
Nu kommer vi till det spännande i det hela. Vad händer om vi optimerar bort anropet till FindControl i ItemDataBound och istället använder ett index för att hämta rätt kontroll?
* ItemDataBound - 21430
* DataBinder.Eval - 22432
Plötsligt vände resultaten till fördel för ItemDataBound. Självklar funkar det inte alltid att använda ett index då man kanske dynamiskt skapar antalet kolumner, men då fungerar inte i heller DataBinder.Eval. Om man har ett fast antal kolumnet, som man ofta har, så kan man komma ner till samma prestanda genom att optimera bort slarviga casts och användandet av FindControl.
Det sista jag gjorde var att prova att rendera ut flera kolumner och då tappade ItemDataBound ett par procent på DataBinder.Eval.
Kontentan är att även om behovet finns för att implementera lite mer komplex logik när man fyller i information i t.ex en DataList så behöver det inte innebära någon märkbar prestandaförlust. Kombinerat med en vettig cachepolicy bord eman kunna få relativt likartade resultat.
Happy coding =)Sv: IF-sats i datalist/repeater
----
The DataBinder.Eval method uses reflection to evaluate the arguments that are passed in and to return the results. If you have a table that has 100 rows and 10 columns, you call DataBinder.Eval 1,000 times if you use DataBinder.Eval on each column. Your choice to use DataBinder.Eval is multiplied 1,000 times in this scenario. Limiting the use of DataBinder.Eval during data binding operations significantly improves page performance. Consider the following ItemTemplate element within a Repeater control using DataBinder.Eval.
----
----
Use the ItemDataBound event. If the record that is being data bound contains many fields, it may be more efficient to use the ItemDataBound event. By using this event, you only perform the type conversion once. The following sample uses a DataSet object.
protected void Repeater_ItemDataBound(Object sender, RepeaterItemEventArgs e)
{
DataRowView drv = (DataRowView)e.Item.DataItem;
Response.Write(string.Format("<td>{0}</td>",drv["field1"]));
Response.Write(string.Format("<td>{0}</td>",drv["field2"]));
Response.Write(string.Format("<td>{0}</td>",drv["field3"]));
Response.Write(string.Format("<td>{0}</td>",drv["field4"]));
}
----
Källa: msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag/html/scalenetchapt06.aspSv: IF-sats i datalist/repeater
Jepp sant. Men som du ser nyttjar du inte FindControl eller hur? Det vi pratade om var
Eval vs ItemBound med FindControl... Sedan återigen, prestanda är inte top nr 1 längre det är priset, det är fortfarande dyrare att köpa arbetskraft än skala upp eller ut en dator för att öka prestandan.
Ibland är to m. lite mer prestandakrävande saker att förespråka om det ger kortare utv tid, färre buggar, lättare återanvändbar kod, lättare fixningar, lättare underhåll.
Prestanda geeks brukar inte ha med så många av dessa punkter i det långa loppet.
Ett annat tips är att man skriver så enkel kod som möjlgit för bättre underhåll och utför tester för att se om de håller de krav man satt upp.
Oftast gör de det, om de inte gör det i alla fall så optimerar man de bitar som går att optimera bättre, men försöker hålla så bra klass som möjligt på koden.
Om det ändå inte heller går kan man se över om man skall höja hårdvarukravet en aning (vilket blir billigare.) om det inte går? ja då finns det ju inte så mycket mer att göra än höja priset på sin produkt genom ökad utv tid för att optimera till det maximala.
Mvh JohanSv: IF-sats i datalist/repeater
Borde inte det snabba upp i så fall?Sv: IF-sats i datalist/repeater
Det är i princip det FindControl gör. Så jag tror inte du direkt kan vinna nått på det. Men o andra sidan så använder man ju den teknik man måste använda för att lösa sitt problem, prestandan är inget man skall direkt ödlsa en massa tid på. Prestandan kan man kolla mot slutet av varje itteration eller liknande och därefter ev optimera koden om den inte håller prestanda kraven. Det viktiga är att få en produkt med god kvalité i rätt tid.
Det är ingen mening att köra ItemBound med FindControl och sedan plocka ut värde skicka det till en metod som sedan returnerar ett värde du vill presentera. Det är en helt onödig lösning och mer pretanda krävande än att skapa metoden och ropa på den från Templates (html sidan) med Eval för att plocka ut värdet du vill ha som parameter.
Du viller tid då det går fortare att koda, du viller kvalité du du får mindre kod att hålla reda på, du minimerar buggar pga lite kod och har större stöd för att göra framtida förändringar snabbt. Du får även en ökad prestanda som tur är i detta fall. Men om detta skulle tagit mer prestanda hade jag ändå byggt på det sättet då det spar mig mer pengar. Åter igen, stirra inte blint på prestanda... Den är alltid alltid o kommer alltid vara billigare att köpa. Arbetstiden är mycket dyrbarare.
Mvh JohanSv: IF-sats i datalist/repeater
Du snackar om intjänad utvecklings tid, men ärligt johan.. vad snackar vi om här? ett par minuter? Inte så att man har 100 tals databundna kontroller på samma sida etc.. bara du går på toa en gång på din arbetdag så har du "slösat" samma mängd tid.
Eval är bra, ibland, men inget magisk verktyg som sparar företaget pengar och ökar prestandan. Allt hänger på situationen och på övriga kodare i projektet - det räcker att en enda kodare i samma projekt inte är optimerings guru så är den prestandan förlorad.. eller en slarvigt designad databas.. finns ingen euforisk lösning på allt... det handlar om relativa termer inget annat.Sv: IF-sats i datalist/repeater
Japp, håller helt klart med om att det ofta är arbetstid som kostar. Men som Andreas skrev ovan så tar det faktiskt inte speciellt mycket längre tid att använda eventet i kod-läge.
Grejen är ju att man ändå vill anamma de lösningarna som anses vara "mest optimala" redan från början. Även om alla projekt har olika krav och lösningar. Själv har jag ofast behov av att implementera logik vid databidningen varför jag också använder eventet.Sv: IF-sats i datalist/repeater
Finner mig oftast (kanske 7 ggr av 10) att man vill bygga in logik i bindingen och då är det som sagt event som gäller.Sv: IF-sats i datalist/repeater
Trodde vi redan gått genom detta. Återigen snackar jag om att implementera FIndControl och event vs Eval. Det är stor skillnad. Jag har även sagt att ItemBoudn är utmärkt att använda i de fall då Eval inte räcker till. Där du måste lösa det hela med ItemBound.
Det hela handlar heller inte om att det tar 1 minut mer att skriva 10 rader mer kod, utan det tar mer än 1 minut när man sedan skall rätta till ev fel i den kod som tog 1 minut vs den som tog en minut mindre. Om du i en applikation har 60 grids kan det till slut röra sig om timmar. Sedan finns det fler faktorer, andra utvecklare som skall ta över och justera i koden måste sätta sig in mer i kod med flera rader vilket också tar tid. Fler rader kod medför även risker för mer buggar. I FindControl har han med ett ID vad hände rom IDt måste ändras? Då fungerar inte längre logiken, man måste ändra på två ställen. (bara ett litet exempel men ett tecken på saker som kan orsaka mer strul än onödan.)
Tänk sedan att om man tänker som du nu gör att 1 minut är inte mkt, tänk du hur ofta man ev gör onödiga lösningar som tar minuter mer än andra i månader långa projekt blir dessa små minuten bäcker till en stor å av minuter, kanske to m en flod.
Vet inte hur länge du jobbat med utveckling av projekt, jag har jobbat sedan 97 och dess för innan arbetat med både dataspel och amiga demos i flera år. Så av erfarenheter vet jag var 1 minut eller 10 extra rader kod faktiskt kan ställa till med om de ändå inte behövs. YDGNI (You don't gonna need it) är en princip jag arbetar efter även DIASAYC (Do it as simple as you can.)
Eval är utan tvekan långsammare än att köra ItemBound men det beror på vad ItemBound gör...
Och varför välja ett sämre allternativ före ett bättre om man ändå vinner tid och prestanda?
"Prestanda, Kvalité, Pris" <--- Välj två...
Mvh JohanSv: IF-sats i datalist/repeater
Verkar som det bara är du som inte följt med att diskussionen för länge sedan gick ifrån den kombination som du snackar om.. Hur som helst.. köper inte ditt minut resonnemang och jag har jobbat med utveckling sen 91 (började med AMOS på Amiga när jag var 11) .. så trots akronymer och liknande så är det ett fall till fall avgörande och inte en tumregel.
Och snackar vi bara renda griddar utan någon som helst logik o likanden så kan man lika gärna använda AutoGenerate på kolumnerna och inte bygga html koden själv.. dvs om man inte behöver specialanspassa utseendet utöver det man kan med hjälp av css.
Men vad säger ni.. vi droppar det här.. nu är vi nere o puttar på damkorn i en diskussion som i början handlade om berg =) Fri vilja, olika projekt och förutsättningar.. olika implementationen - så är facit =PSv: IF-sats i datalist/repeater
"Själv har jag ofast behov av att implementera logik vid databidningen varför jag också använder eventet. "
Absolut så gör jag med, om enbart Eval inte kan lösa mitt problem.
Men i fallet ovan med Eval + funtion från Html sida vs ItemBound + FindControl + logik ger sista allternativet fler nackdelar.
Mer kod,
Lite svårare spårbarhet,
Mer utv tid,
mer testande,
lättare att skapa buggar.
Många bäcker små leder till stor Å. Hur små bäckarna än är kan de ställa till med besvär.
Alla gör på sitt sätt, jag delar bara med mig av mina kunskaper och erfarenheter, sedan är det upp till var och en att göra det som de anser bäst för dem. Så jag klandrar inte lösningen med ItemBound och FindControl jag bara inte föredrar den före den med Eval och metodanrop.
Mvh Johan Sv: IF-sats i datalist/repeater
"Verkar som det bara är du som inte följt med att diskussionen för länge sedan gick ifrån den kombination som du snackar om.."
Då jag argumenterar om ItemBound med Findcontrol vs Eval och metodanrop och du skriver till mig och svarar på detta anser jag att jag hela tiden först denna diskussion.
Men vi gör som du säger ci slutar där, man kan hålla på i evigheter, som med politik :-)
Man gör som man vill, men att man bör välja det som ger flest fördelar om man kan. Men det handlar om smak o tycke, erfarehet och behov.
Mvh Johan