Avatar billede tinaw25 Nybegynder
02. februar 2015 - 22:43 Der er 3 kommentarer og
1 løsning

Undgå duplikater i en repeater

Hejsa

Jeg har en repeater hvor jeg viser nogle side navne og tilhørende billeder.

Men lige nu ser det sådan her ud:

Forside
1.jpg

Forside
2.jpg

Om os
3.jpg

Om os
4.jpg

Jeg vil godt have det til at se sådan ud her:

Forside
1.jpg, 2.jpg

Om os
3.jpg, 4.jpg

Men jeg kan virkelig ikke gennemskue, hvordan jeg får løst dette problem. Her er koden som den ser ud i repeateren.

<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>" SelectCommand="SELECT billeder.filnavn, sider.side_navn FROM billeder INNER JOIN sider ON billeder.fk_side_id = sider.side_id GROUP BY sider.side_navn, billeder.filnavn">
             
</asp:SqlDataSource>

<asp:Repeater ID="Repeater1" runat="server" DataSourceID="SqlDataSource1">
           
               
<ItemTemplate>
      <p class="text"><h2><%#Eval("side_navn") %></h2></p>
      <img src="../images/vogne/Thumbs/<%#Eval("filnavn") %>" alt=""/>
     
</ItemTemplate>
</asp:Repeater>

Skal jeg måske hente mit data fra databasen i en List også på den måde slette de dupletter der findes på navnet??

Eller er der nogle andre som har gode idér??

Mvh,

Tina
Avatar billede keysersoze Guru
02. februar 2015 - 23:57 #1
Det du har gang i er generelt ikke specielt skalerbart eller genbrugeligt så det optimale vil være at lave en metode, der returnerer en liste af sider hvor en side har de to properties string navn og list billeder. Alternativt er du ude i en nested repeater (hvilket potentielt kan give uhensigtsmæssigt mange db-opslag) eller omskrivning af din sql til at benytte en nested select.
Avatar billede arne_v Ekspert
03. februar 2015 - 03:38 #2
Mit forslag:
* drop SqlDataSource
* brug en ordentlig OOP data struktur
* brug nested repeater

Demo:


<%@ import namespace="System.Collections.Generic" %>
<%@ import namespace="System.Linq" %>
<html>
<head>
<script language="C#" runat="server">
public class Picture
{
    public String PageName { get; set; }
    public String PictureFileName { get; set; }
}
public class PictureList
{
    public String PageName { get; set; }
    public List<String> PictureFileNames { get; set; }
}
public class PictureUtil
{
    public static List<Picture> GetFlatPictureList()
    {
        // this is a dummy method - the real method should fetch from database using ADO.NET or EF
        List<Picture> result = new List<Picture>();
        result.Add(new Picture { PageName = "Forside", PictureFileName = "1.jpg" });
        result.Add(new Picture { PageName = "Forside", PictureFileName = "2.jpg" });
        result.Add(new Picture { PageName = "Om os", PictureFileName = "3.jpg" });
        result.Add(new Picture { PageName = "Om os", PictureFileName = "4.jpg" });
        return result;
    }
    public static List<PictureList> FlatToStructured(List<Picture> flatlist)
    {
        return flatlist.Select(p => p.PageName).Distinct().Select(s => new PictureList { PageName = s, PictureFileNames = flatlist.Where(p => p.PageName == s).Select(p => p.PictureFileName).ToList() }).ToList();
    }
}

void Page_Load(Object sender, EventArgs e)
{
    data.DataSource = PictureUtil.FlatToStructured(PictureUtil.GetFlatPictureList());
    data.DataBind();
}
</script>
</head>
<body>
<form runat="server">
    <asp:Repeater id="data" runat="server">
        <ItemTemplate>
            <p>
            <%# Eval("PageName") %>:
            <br>
            <asp:Repeater id="pics" datasource='<%# Eval("PictureFileNames") %>' runat="server">
                <ItemTemplate>
                  <img src="<%# Container.DataItem %>">
                </ItemTemplate>
            </asp:Repeater>
            </p>
        </ItemTemplate>
    </asp:Repeater>
</form>
</body>
</html>
Avatar billede tinaw25 Nybegynder
04. februar 2015 - 22:31 #3
Arne_v :
Ser rigtig smart ud, men lige et niveau over mig endnu :-). Kender intet til ADO.NET.

keysersoze :
Jeg har lavet en nested repeater, men har du en idé om hvordan man kan få ind og sige at hvis en forside navn ikke har et billede, så skal den heller ikke vise navnet??

Jeg har brugt databinder til fylde min repeater fra databasen.

Og smid gerne lige et svar keysersoze så jeg kan give dig point
Avatar billede keysersoze Guru
05. februar 2015 - 10:38 #4
Du kan løse det enten ved at kigge på din ItemDataBound-event på din parent og her gå ind i tælle antal items på din child repeater - eller ved simpelthen kun at selecte dem ud der reelt har children.
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