Avatar billede bumle90 Nybegynder
11. december 2004 - 19:02 Der er 14 kommentarer

Kode layout til datarepeater

Jeg har en datarepeater der lige nu bare spytter en hel tabel ud.
Jeg skal bruge en repeater fordi jeg skal lave en masse grupperinger osv. af den data der kommer ud.
Faktisk har jeg en sql hvor jeg har lavet ORDER BY id1,id2,id3.

Jeg skal altså have 3 grupperinger.

Nu vil jeg så i min repeater gerne kunne rykke et niveau ind hver gang der kommer et nyt id. Altså det skal forståes således at for hver id1 der er kan der være mange id2, og for hver id2 kan der være mange id3.
Så udskriften af min data skal se således ud:
id1.0
--id2.0
----id3.0
----id3.1
--id2.1
--id2.2
----id3.0
----id3.1
----id3.2
id1.1


osv derned af.
Så jeg skal på eneller anden måde hive ID ud af min datarepeater og kunne lave nogle udskrifter på baggrund af det.
Faktisk ligesom i gode gamle asp hvor man bare hev ud af et resultset, og på baggrund af det man hev ud skrev noget ud på siden.
Hvordan kan jeg gøre det med en datarepeater? Jeg har prøvet noget i retning af:

<%#
            int a=Convert.ToInt32(DataBinder.Eval(Container.DataItem, "STED_NR"));
            if(a%2==0)
            {
        %>
            <tr>
        <%#
            }else{
           
            %>
            <tr bgcolor=#ff6600>
        <%# }%>


Bare for at teste, men det kan den ikke kompilere.
P.S. ved godt der er mange nemmere måder at farve rækker på, men det er heller ikke det der er meningen jeg skal. Jeg ville blot checke om man kunne bruge sådan en syntaks...og det kunne man så ikke.
Så hvordan gør jeg? mvh.
Avatar billede bumle90 Nybegynder
11. december 2004 - 19:53 #1
Er det til at forstå hvad jeg mener?
Måske er det lidt snørklet skrevet...
Avatar billede burningice Nybegynder
11. december 2004 - 22:55 #2
prøv at kig på nested repeatere
Avatar billede tomjelen Nybegynder
12. december 2004 - 14:45 #3
Vil tro at den kode du skrev virker hvis du fjerner #'erne.

Jeg kan ikke lige gennemskue hvordan din data ser ud, men jeg vil gætte på at din data opbygning ser således ud:
Du har en tabel med id1.x'er, som har en "1 til mange" relation til tabellen som indeholder id2.x'er. Og tabellen med id2.x'er har en samme relation til en tabel med id3.x'er.
Hvis dette er tilfældet, så kunne du trække de tre tabeller ud i et dataset, og sætte et par DataRelations op imellem tabellerne. Og derefter ved hjælp af 3 nested repeaters, som cyberfessor nævner, liste din data.
Avatar billede bumle90 Nybegynder
12. december 2004 - 18:54 #4
problemet er bare at hvis jeg skal gøre det skal jeg jo hive alt indholdet af de 3 tabeller ud i datasettet....Det ville være lige vildt nok synes jeg. Ellers skal jeg lave forespørgsel på hvert gennemløb af....og det er også lidt uhensigtsmæssigt synes jeg
Avatar billede tomjelen Nybegynder
12. december 2004 - 19:35 #5
Var nok lidt dårlig formulering af mig hehe. Du behøver ikke at hente alt data ud fra de tre tabeller for at lave en relation imellem dem i dataset'et. Men du kan bare via din SQL filterer udtrækene, til kun det data der har interesse.

Du har jo også som mulighed, bare lave et enkelt udtræk, hvor du joiner tabellerne sammen, og så kun bruger en enkelt repeater. I den repeater kan du når onitemdatabound eventen udløses, kigge på data'en og så formatere html'en i den "repeater række" som du har løst. De betyder så, at du skal have lidt logik ind, til at skeldne forskel på de rækker du vil formatere specielt.
Avatar billede bumle90 Nybegynder
12. december 2004 - 20:32 #6
ja...det er sådan jeg har lavet det indtil videre...ved bare ikke hvor pæn den løsning er...
men det virker da :)
Avatar billede bumle90 Nybegynder
12. december 2004 - 20:35 #7
Men jeg skal lige høre, du siger
"Men du kan bare via din SQL filterer udtrækene, til kun det data der har interesse"
hvis jeg gør det har jeg jo lavet mine joins og fået fat i en enkelt datatable?
Mener du så at jeg skal køre den igennem og splitte den op i 3 eller hvad?
Eller mener du jeg skal lave 3 queriers? for det kan jo ikke lige lade sig gøre som jeg ser det. Så bliver jeg istedet nødt til at lave en forespørgsel pr. nye id1 når jeg skal hav enoget nyt id2 data ud hvis du kan forstå hvad jeg mener :D
Avatar billede burningice Nybegynder
12. december 2004 - 21:01 #8
det man normalt gør er at lave noget lign. det her:

<asp:repeater id="rpt1" runat="server">

<itemtemplate>

    <asp:repeater id="rpt2" runat="server DataSource='<%# GetDataForRepeater2(Container.DataItem) %>'>

    <itemtemplate>
        <asp:repeater id="rpt3" runat="server DataSource='<%# GetDataForRepeater3(Container.DataItem) %>'>

        <itemtemplate>

        </itemtemplate>

          </asp:repeater>
    </itemtemplate>

    </asp:repeater>

</itemtemplate>

</asp:repeater>
Avatar billede tomjelen Nybegynder
12. december 2004 - 21:58 #9
Tænkte mere på filtrering via "where" clausen i sql, på de tre tabel udtræk. Men hvis det ikke kan lade sig gøre, så kan jeg umiddelbart kun se to udveje.
Enten hente alt data, fra de tre tabeller via et enkelt kald til en enkelt SP, og derefter bruge datarelations og filter på dataset'et, for at få din data sat op som du vil have det.
Eller også laver du et database kald per id som du selv siger.

Sidste løsning er nok nemmest at implementere, men med 3 nested repeaters kommer det hurtigt op i mange database kald for en enkelt liste.. Men jeg ved ikke hvor meget det betyder performace mæssigt, i forholdet at hente en gang og behandle et stort dataset. Har aldrig rigtigt undersøgt det :)

Men hvis du er tændt på at pille ved DataSet med DataRelations, så er der en god artikkel her:

http://www.codeproject.com/aspnet/Mastering_DataBinding.asp?df=100#3
Avatar billede burningice Nybegynder
12. december 2004 - 22:19 #10
at lave mange kald til en database burde ikke være noget problem, så længe man genbruger samme connection og det har man jo Connection Pooling til.
Avatar billede tomjelen Nybegynder
12. december 2004 - 22:32 #11
Tja, ens database står jo som reglen på en anden computer et sted på netværket. Jeg har en eller anden forstilling om at, netværks kommunikation ikke er særligt hurtigt i forholdet til at kommunikere med et dataset i rammen. Og at 1 udtræk der henter f.eks. 3x100 rækker ufiltreret, tager mindre resourcer på database serveren, end 200 enkelt række queires i træk.
Men jeg har desværre ingen ide om hvor meget forskel der er, og om hvor mange database kald der skal til før det betyder noget.. Måske er det bare flueknepperi :)
Avatar billede bumle90 Nybegynder
13. december 2004 - 01:24 #12
Cyberprofessor, jeg kan godt lide din løsning..men der er bare lige en lille hage.
Det er ikke hver gang jeg skal lave et indryk. Hvis ID1 ikke har nogle ID2 tilknyttet skal der bare rykkes til næste linie og printe den næste ID1 og ligeledes med ID2 og ID3. Er du med på hvad jeg mener. Det er altså muligt at have en struktur som denne:
id1
--id2
----id3
----id3
----id3
--id2
--id2
id1
id1
id1
id1

osvosv
Avatar billede burningice Nybegynder
13. december 2004 - 01:43 #13
det er jo netop det smarte ved en repeater... inholdet af <itemtemplate> bliver jo kun skrevet ud hvis der rent faktisk bliver bindet noget data til den
Avatar billede bumle90 Nybegynder
13. december 2004 - 08:04 #14
okay...det lyder satme lovende synes jeg :)
Det kunne være jeg skulle kigge lidt nærmere på det.
Problemet er bare stadig lidt hvordan jeg får splittet min query op i 3 dele.
Jeg er ikke meget for at skulle i databasen for hver ny gruppe....for det vil være mange gange....medmindre jeg selvfølgelig beslutter mig for at bruge paging.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester