Avatar billede dampnet Nybegynder
11. marts 2004 - 13:36 Der er 6 kommentarer og
1 løsning

2 nested repeatere, problem med at sætte visible att.

Hej folkens

Jeg har en repeater som indeholder en anden repeater, som ligner dette(jeg har pillet den del fra for at gøre det overskueligt men jeg har ikke fjerne noget af betydning) :

        <asp:Repeater id="ordre" runat="server">
            <HeaderTemplate>
                <table width="590" border="0" cellpadding="0" cellspacing="0">
                    <tr>
                        <td>
                            &nbsp;</td>
                    </tr>
            </HeaderTemplate>
            <ItemTemplate>
                <tr>
                    <td valign="top">
                        <%# DataBinder.Eval(Container.DataItem, "dato") %></td>
                </tr>
                <tr>
                    <td colspan="7" >
                        <table id='<%# DataBinder.Eval(Container.DataItem, "ordreid") %>'>
                            <tr>
                                <td>
                                    <asp:Repeater id="underOrdre" runat="server" DataSource='<%# BindChildOrderListe(Ctype(DataBinder.Eval(Container.DataItem,"ordreid"), Integer)) %>'>
                                        <HeaderTemplate>
                                            <table width="577" border="0" cellpadding="0" cellspacing="0">
                                                <tr>
                                                    <td>
                                                        Bestilling:</td>
                                                </tr>
                                        </HeaderTemplate>
                                        <ItemTemplate>
                                            <tr>
                                                <td>
                                                    <%# DataBinder.Eval(Container.DataItem, "bestilling") %></td>
                                            </tr>
                                        </ItemTemplate>
                                        <FooterTemplate>
                                            <tr>
                                                <td>
                                                    <a href="#top">top</a></td>
                                            </tr>
                                            </table>
                                        </FooterTemplate>
                                    </asp:Repeater>
                                </td>
                            </tr>
                        </table>
                    </td>
                </tr>
            </ItemTemplate>
            <FooterTemplate>
                <tr>
                    <td>
                        <img border="0" src="../images/lstnoder.gif" width="16" height="22" /><img border="0" src="../images/txtdoc.gif" width="24" height="22" /></td>
                    <td colspan="6">
                        <a href="ordre.aspx">opret ny order</a></td>
                </tr>
                </table>
            </FooterTemplate>
        </asp:Repeater>
og bruger så disse functioner :
    Protected Function BindOrderListe(ByVal tid As DateTime)
        Dim madDataset As New DataSet
        Dim strSql As String = "SELECT MadOrdre.ordreid, Format$(MadOrdre.dato,'dd-mm-yyyy') AS Dato_, Format$(MadOrdre.dato,'hh:mm') AS Tid, MadOrdre.antalbestillinger as Antal, Spisested, Ansvarlig, email FROM MadOrdre WHERE (MadOrdre.dato>#" & Tool.getTimeString(tid) & "#) AND (MadOrdre.bestilt=false) ORDER BY MadOrdre.dato"

        Try
            dbconnection.Open()
            Dim dbdataadapter As OleDbDataAdapter = New OleDbDataAdapter(strSql,dbconnection)
            dbdataadapter.Fill(madDataset, "MadOrdre")
            ordre.DataSource = madDataset.Tables("MadOrdre")
            ordre.DataBind()
        Catch ex As exception
            errorLabel.Text = "Fejl: " & ex.message & "<br /> strSql: " & strSql.ToString()
        Finally
            If dbconnection.State = ConnectionState.Open Then
                dbconnection.Close()
            End If
        End Try
    End Function

    Protected Function BindChildOrderListe(ByVal ordreid As Integer) As DataSet
        Dim underMadDataset As New DataSet
        Dim strSql As String = "SELECT * FROM underMadOrdre WHERE ordreid=" & ordreid.ToString()
        Try
            Dim dbdataadapter As OleDbDataAdapter = New OleDbDataAdapter(strSql,dbconnection)
            dbdataadapter.Fill(underMadDataset, "underMadOrdre")
        Catch ex As exception
            errorLabel.Text = "Fejl: " & ex.message
        End Try
        if not underMadDataset.IsEmpty() then
            Return underMadDataset
        else
            return new dataset
        end if
    End Function

Mit problem er at når jeg få en linie ud i den overlæggende repeater som ikke har nogen underordre tilknyttet bliver header og footer stadig generet og jeg får en masse spild plads med tomme tabler. Er der ikke en mulighed for at lave en form kontrol også sætte den pågældende repeaters visible attribut til false. Men selvfølgelig stadig kun på den ene linie i den udenom læggende repeater.

Håber der er en som forstå og kan hjælpe mig, på forhånd tak.
Avatar billede burningice Nybegynder
11. marts 2004 - 13:45 #1
du kan vel lave en funktion der regner ud om repeateren skal vises eller ej

<asp:Repeater id="underOrdre" runat="server" DataSource='<%# BindChildOrderListe(Ctype(DataBinder.Eval(Container.DataItem,"ordreid"), Integer)) %>' visible='<%# isVisible(Ctype(DataBinder.Eval(Container.DataItem,"ordreid"), Integer)) %>'>
Avatar billede dampnet Nybegynder
11. marts 2004 - 15:17 #2
Den løsning kunne godt bruges og lige nu er den også blevet implementeret men jeg kan godt se at det nok ikke er den bedste/mest optimale løsning. Men det er vel opbygningen af siden som skal ændres for at kunne gøre det pænere.

cyberfessor:
Du skal da have points for din løsning, så smider du ikke lige et svar.
Avatar billede burningice Nybegynder
11. marts 2004 - 15:20 #3
svar :)

om det er den bedste løsning ved jeg ikke, men jeg kan da ikke lige umiddelbart se hvad der er galt med den.. synes da selv den er meget elegant :)
Avatar billede burningice Nybegynder
11. marts 2004 - 15:21 #4
hov, det var det svar :)
Avatar billede burningice Nybegynder
11. marts 2004 - 15:22 #5
fårk jeg tåger... det må være al den kaffe... sidder og har biologi og har lige lavet et doping-forsøg :)
Avatar billede dampnet Nybegynder
11. marts 2004 - 15:27 #6
alle gode gange 3 :)

Jeg siger skam heller ikke løsningen er dårlig, den er jo faktisk lige det jeg mangler. Så tak for det. Men jeg tænker at der må være en nemmere måde at lave hele min opbygning på. Jeg har fjernet meget af html og aspx koden for at gøre det mere overskueligt. Det er lidt mit første aspx site jeg sidder og laver og lærer som jeg kommer til problemerne og det gør jo nok at jeg ikke altid får lavet best practice :)
Avatar billede burningice Nybegynder
11. marts 2004 - 15:41 #7
ja, ok.. det er selvfølgelig rigtig nok... well, jeg kan da komme med nogle fif

1) Lad vær med at bruge DataBinder.Eval, da den bruger late binding og reflection til at finde ud af hvilken type der er brugt som datasource til din repeater. Cast hellere dit Container.DataItem til den rigtige type da du på den måde kan benytte early-binding som gør din kode hurtigere
2) der er meget overhead på DataSet-klassen, og hvis du kun skal hive ting ud af databasen, så brug hellere en DataReader da den er meget hurtigere. Lav evt. dine egne Strong Typed-collections der er specialiserede til dit formål
3) benyt dig af css istedet for de gamle atributter
4) drop vb.net og skift til c# ;)
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