webForumDet fria alternativet

Skriva ut endast 2 om det är fler än 2 st.

.NET

10 svar · 504 visningar · startad av Fredde Mannen

Medlem sedan nov. 20014 054 inlägg
Frågan#1

Har denna kod för att nestla i en repeater, men jag vill endast den som binder till ds, att den skriver ut 2 poster, om det finns fler än 2 poster... men vet inte riktigt hur jag skall gå tillväga.

Ds innehåller alla poster (alla counties som hör till id)

Något tips.?

    Private Sub repScheduledbanners_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles repScheduledbanners.ItemDataBound
        If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then
            Dim innerRep As Repeater = CType(e.Item.FindControl("innerRep"), Repeater)
            Dim bannerscheduleId As Integer = e.Item.DataItem("BannerScheduleId")

            ' kasta ut innehållet counties.
            Dim ds As New DataSet
            ds = GetCounties(bannerscheduleId)

            With innerRep
                .DataSource = ds
                .DataBind()
            End With

        End If

    End Sub
Medlem sedan dec. 19996 721 inlägg
#2

Jag förstod inte riktigt frågan...

Vill du ha max 2 counties i den bundna repeatern? Hämta då bara två (modifiera GetCounties)

ds = GetCounties(bannerscheduleId,2)

Övriga kommentarer:

Du behöver inte instantiera "ds" före GetCounties, för det tar GetCounties hand om.

Dim ds As DataSet
ds = GetCounties(bannerscheduleId)

Dessutom, behöver du verkligen ett DataSet från GetCounties? Räcker det inte med DataTable?

Medlem sedan juli 2004206 inlägg
#3

..och är du bunden till att inte kunna eller vilja ändra på dina sql-satset så kan du alltid som undantag köra ditt dataset via en dataviewer och där lägga till filter för att åstadkomma det du vill. Kanske lite overkill, men... :)

Medlem sedan nov. 20014 054 inlägg
#4

Ursäkta min oklarhet... var lite trött i huvudet! :)

emission skrev:

Jag förstod inte riktigt frågan...

Vill du ha max 2 counties i den bundna repeatern? Hämta då bara två (modifiera GetCounties)

doh! *tänker* få se nu använder jag den usp:n till något annat?

Måste kolla.. det kanske räcker med det som lösning då.. :)

emission skrev:

ds = GetCounties(bannerscheduleId,2)

Övriga kommentarer:

Du behöver inte instantiera "ds" före GetCounties, för det tar GetCounties hand om.

Dim ds As DataSet
ds = GetCounties(bannerscheduleId)

ja det kanske man inte behöver.. :)

emission skrev:

Dessutom, behöver du verkligen ett DataSet från GetCounties? Räcker det inte med DataTable?

ja det vore ju optimalt med ett datatable, får undersöka det vidare. :)

Medlem sedan nov. 20014 054 inlägg
#5

desdecado skrev:

..och är du bunden till att inte kunna eller vilja ändra på dina sql-satset så kan du alltid som undantag köra ditt dataset via en dataviewer och där lägga till filter för att åstadkomma det du vill. Kanske lite overkill, men... :)

Ja det är ju ett alternativ om nu inte usp:n tillåter en max 2. :)

Medlem sedan jan. 200475 inlägg
#6

Om du aldrig vill ha ut mer än 2 rader skall du göra denna begränsnnig i queryn. Finns inget som rättfärdigar att man skall hämta mer data än nödvändigt från databasen för att sedan sortera bort det i applikationen.
I min mening bör man alltid sträva efter en så prestanda optimal lösning som möjligt så länge det inte innebär allt för mycket extra arbete. För eller senare sitter man med en mer prestandakritisk applikation och har man alltid kodat enligt"best pratice" så faller det mer naturligt och man tjänar avsevärt mycket tid. Om inte annat så tänk på miljön eftersom lägre serverbelastning innebär lägre elkonsumption ;)

Medlem sedan feb. 2005280 inlägg
#7

mo:d:fi skrev:

...Finns inget som rättfärdigar att man skall hämta mer data än nödvändigt från databasen för att sedan sortera bort det i applikationen.
...

Uj, såna här kategoriska uttalanden lockar verkligen till att gå i svaromål... ju längre man hållit på hackande kod så inser man att det finns alltid andra sätt som kan vara bra under vissa betingelser ;)

I detta fall kan det ju tex vara så att man kanske har läst ut en hel tabell i en DataTable som man sedan cachar på servern i 24 timmar som man använder sig av, för att _få_ prestanda ... finns säkert massa andra varianter också :bire

Medlem sedan jan. 200475 inlägg
#8

Både ja och nej. Prestanda och optimering vs tid och genvägar är alltid ett hett duskussionsämne. Men i nämnt antog jag av diskussionen att data skulle hämtas varje gång i vilket fall.
Vad är det senare som säger att du inte har bättre prestanda på att hämta data från databas varje gång (sökningen ligger ju även i cache i databasen med stor sannolikhet) jämfört med att ha ett enormt DataTable i serverminnet hela tiden och filtrera där varje gång. Jag sätter nog mina pengar på att databasen filtrerar snabbare än applikationen. beroende på storlek så är det ju inte säkert att man har prestande bara för att det ligger cache'at heller.

Medlem sedan feb. 2005280 inlägg
#9

Jag menade bara hypotetiskt att det finns lägen där man inte vill/kan ändra sin sql-query att bara hämta just det aktuella antalet poster, vilket du påstod ;)

Om man ska spåna vidare på andra lägen där man inte vill prata med db, så finns det ju andra situationer, tex om sql query är hopplöst komplex med massa joins och tar lång tid att exekvera, vilket inte är helt ovanligt. Eller att man ska använda det aktuella DataSet till andra saker, binda till en gridView eller nåt.

Dessutom behöver inte DataTable vara enormt stor bara för att sql-frågan var komplex.

Well nog tjötat om detta kanske? ;)

Medlem sedan jan. 200475 inlägg
#10

Agreed, 2 sidor av samma mynt :)

Medlem sedan nov. 20014 054 inlägg
#11

mo:d:fi skrev:

Om du aldrig vill ha ut mer än 2 rader skall du göra denna begränsnnig i queryn. Finns inget som rättfärdigar att man skall hämta mer data än nödvändigt från databasen för att sedan sortera bort det i applikationen.

Ja, om jag nu bara hade varit tvungen att endast hämta två rader hade det varit en annan sak... :)

Tänkte igenom lite grann och insåg att, doh!, du kan inte bara hämta 2 poster. För det jag skulle uppnå var att, dels visa:

om fler än 2 poster, visa
post1, post2... (punkterna menar att det finns fler poster, men de skall inte synas)
annars
post1, post 2 ( om det inte fanns mer än två poster, inga punkter)

Sen skulle dessa poster vara en asp:hyperlink utan navigateurl, men med en tooltip som visar alla poster när man hovrar ovanför posterna som syns.

Löste dock detta genom att dels kontrollera antalet rader i ds.Tables(0) , och de var mer än 2 så plocka endast ut 2 rader. men innnan detta så sökte jag fram kontrollen via FindControl för att sätta som tooltip hela ds:et.

Så nu funkar det som tänkte.. :)

Optimalt? Mja.. men det funkar..

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