Avatar billede fanatic Nybegynder
11. oktober 2007 - 18:57 Der er 9 kommentarer og
1 løsning

Blog der viser nyheder og billeder - hvordan skal det kodes?

Hej eksperter.

Jeg er i gang med at lave en blog. Ideen er simpel nok, jeg ønsker at få vist nogle nyheder på siden. Dette er dog ikek noget problem for mig. Jeg henter noget data fra en Access database, får det leveret i et dataset og benytter en Repeater-kontrol til at vise det i.
Jeg kunne dog godt tænke mig, samtidigt, at få vist en række billeder til hver eneste indlæg der skrives ud via Repeateren. Præcis som her http://www.unsafe.dk.

Mit spørgsmål er så, hvordan gør jeg det?

Som det ser ud nu så har jeg en codebehind-fil med følgende metode:


public static DataSet ViewNews()
    {
        string sql;
        DataSet myData;
        //sql = "SELECT n.newsTitle, n.newsCreateDate, n.newsMessage, n.newsAuthor, n.newsId FROM News n ORDER BY n.newsCreateDate DESC";
        sql = "SELECT COUNT(c.commentAuthor)AS NumberOfComments, n.newsTitle, n.newsCreateDate, n.newsMessage, n.newsAuthor, n.newsId FROM News n LEFT JOIN Comment c ON n.newsId = c.commentNewsId GROUP BY n.newsTitle, n.newsCreateDate, n.newsMessage, n.newsAuthor, n.newsId ORDER BY n.newsCreateDate DESC";
        myData = DataControl.GetDataSet(sql);

        return myData;
    }

Denne returnerer altså et dataset med samtlige nyheder og så bruger jeg count til at vise hvor mange kommentarer der er til hver nyhed. Dette dataset fodrer jeg en repeater med. Men hvad gør jeg hvis jeg skal have et udtræk fra endnu en tabel som linker til mine billeder?

Håber der er nogle der har nogle gode ideer.
Avatar billede neoman Novice
11. oktober 2007 - 19:13 #1
Så lægger du dette her ind i repeateren et passende sted:

<asp:Image ID="Image1" runat="server"  ImageUrl='<%# Eval("MyImageUrl") %>'/>

hvor du i dit dataset har en kolonne med image urler (som string) som hedder MyImageUrl
Avatar billede fanatic Nybegynder
11. oktober 2007 - 19:36 #2
neoman>> Tak for dit svar. Men for mig at se så vil der med dit forslag kun blive vist et billede til hvert indlæg. Der skal jo gerne kunne tilknyttes mangle billeder til hvert indlæg.

Kan man mon have en repeater inde i en repeater? Eller hvordan gør man normalt sådan noget. Der er jo tale om en tabel i db'en med nyheder i. Derudover er der en tabel med info om billeder som ligger i en folder. Det er jo ligefør et jeg må lav edet i to forespørgsler til db'en eller hvad? En repeater kan jeg jo kun fodre med ét dataset..men ok muligvis jeg kan smide resultatet fra de to forespørgsler til db'en ind i ét dataset og give til repeateren, men jeg kan ærlig talt ikke lige overskue hvordan jeg skal gøre det?
Avatar billede neoman Novice
11. oktober 2007 - 19:44 #3
Du kan have repater i repeater.

Det simpleste (men mindst effektive) er:

I den ydre repeater lægger du en datasource som henter rækker med billed urler, 
samt en repeater som bruger denne datasource.

I den ydre repeaters ItemDataBound event handler:
1. sætter du den select parameter som den datasource skal hente billeder efter
2. databinder du den indre repeater til dens datasource

Husk at sætte datasourcen's DataSourceMode=DataReader (medmindre du insisterer på at have et dataset).
Avatar billede neoman Novice
11. oktober 2007 - 19:52 #4
Hvis du vil bruge relationer i et dataset så er der et eksempel her:
http://support.microsoft.com/kb/306154

og lidt mere læseligt her: http://www.dotnetspider.com/kb/Article1039.aspx
Avatar billede fanatic Nybegynder
11. oktober 2007 - 22:09 #5
neoman>> ok, tak for hjælpen...jeg kigger på det i morgen. Send du bare et svar så du kan få point ;-)
Avatar billede neoman Novice
11. oktober 2007 - 22:58 #6
okie -  bare vend tilbage når du havner i problemer
Avatar billede fanatic Nybegynder
13. oktober 2007 - 00:12 #7
Hej neo. Tak for din hjælp, jeg har prøvet at følge eksemplet fra microsoft hvilket du kan se i nedenstående kode. Jeg får ikke nogen fejl når jeg kører koden og siden hentes frem. Dog vises der ingenting på siden, som om at datasættet er tomt eller sådan noget?? Kan du se ud fra koden hvad jeg gør galt?


Code-behind fil:

protected void Page_Load(object sender, EventArgs e)
    {
        DataSet ds = new DataSet();

        DataTable newsTable = ViewNews().Tables[0].Clone();
        DataTable pictureTable = ViewPictures().Tables[0].Clone();

        newsTable.TableName = "news";
        pictureTable.TableName = "pictures";

        ds.Tables.Add(newsTable);
        ds.Tables.Add(pictureTable);

        //ds = ReplaceCustomTagsWithHtml(ds);

        //Create the relation between the News and Pictures tables.
        ds.Relations.Add("myrelation",
        ds.Tables["news"].Columns["newsId"],
        ds.Tables["pictures"].Columns["pictureNewsId"]);

        rpNews.DataSource = ds.Tables["news"];
        rpNews.DataBind();
    }

    public static DataSet ViewNews()
    {
        string sql;
        DataSet myData;
       
        sql = "SELECT * FROM News ORDER BY newsCreateDate DESC";
        myData = DataControl.GetDataSet(sql);
       
      // myData = ReplaceCustomTagsWithHtml(myData);

        return myData;
    }


    public static DataSet ViewPictures()
    {
        string sql;
        DataSet myData;
       
        sql = "SELECT * FROM Picture";
        myData = DataControl.GetDataSet(sql);

      //  myData = ReplaceCustomTagsWithHtml(myData);

        return myData;
    }


aspx fil:

<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
<br />
   
    <asp:Repeater ID="rpNews" runat="server">
        <HeaderTemplate>
        </HeaderTemplate>
        <ItemTemplate>
            <br />
            <table width="100%">
                <tr>
                    <td valign="top">
                       
                            <span style="font-size: 16pt; color: DarkRed;"><strong><%# Eval("newsTitle")%> - </strong></span><span style="color: Gray; font-size: 10pt;"><%# Eval("newsCreateDate", "{0:g}")%></span>
                               
                        <br /><br />
                        <%# Eval("newsMessage")%>
                        <br />
                        <br />
                        <div id="textright"><i>Skrevet af:
                            <%# Eval("newsAuthor")%> - <a href='Comments.aspx?<%#DataBinder.Eval(Container, "DataItem.newsId")%>'> <%# Eval("newsCommentsNumber")%> kommentarer</a></div>
                        </i>
                    </td>
                   
                </tr>
               
            </table>
                     
        <asp:repeater id="childRepeater" runat="server" datasource='<%# ((DataRowView)Container.DataItem).Row.GetChildRows("myrelation") %>' >
            <itemtemplate>
                <%# DataBinder.Eval(Container.DataItem, "[\"pictureTitle\"]")%><br>   
            </itemtemplate>
        </asp:Repeater>
           
     
            <div id="separator">
            </div>
        </ItemTemplate>
    </asp:Repeater>
        <br /><br />
</asp:Content>
Avatar billede neoman Novice
13. oktober 2007 - 11:51 #8
Kan ikke se noget umiddelbart, udover at din indre repeater formentligt ikke bliver databundet, da du ikke binder den eksplicit nogen steder. I MS's eksempel brugte de Page.Bind, som skulle binde alle kontrollerne i et hug.

Men det skulle vel ikke hindre data fra den ydre repeater i at blive vist. Har du prøvet at gøre det step by step som i eksemplet, og først teste  om din ydre repeater kører ?
Avatar billede fanatic Nybegynder
14. oktober 2007 - 09:26 #9
Hej neoman.
Sådan nu fungerer det. Jeg skulle bruge copy() i stedet for clone(). Nu får jeg alt mit data overført til repeater'ene. Så nu ser den bagerste kode således ud:

protected void Page_Load(object sender, EventArgs e)
    {
        DataSet ds = new DataSet();

        DataTable newsTable = ViewNews().Tables[0].Copy();
        newsTable.TableName = "news";
        ds.Tables.Add(newsTable);

        DataTable pictureTable = ViewPictures().Tables[0].Copy();
        pictureTable.TableName = "picture";
        ds.Tables.Add(pictureTable);

        //ds = ReplaceCustomTagsWithHtml(ds);

        //Create the relation between the News and Pictures tables.
        ds.Relations.Add("myrelation",
        ds.Tables["news"].Columns["newsId"],
        ds.Tables["picture"].Columns["pictureNewsId"]);

        rpNews.DataSource = ds.Tables["news"];
        rpNews.DataBind();
    }

Nu har jeg kun et simpelt problem tilbage. I den inderste repeater, hvordan får jeg linket en Image-kontrol til stien på billedet (som står i et felt i databasetabellen "picture"). En direkte måde kunne være:

<asp:Image ID="Image1" runat="server" ImageUrl= "~/Pictures/<%# DataBinder.Eval(Container.DataItem, "[\"pictureUrl\"]")%>" /><br>

Men jeg har et "tag" inden i et asp:image-tag!! Det brokker compileren sig over. Men hvordan kan jeg så hente mit databasefelt "pictureUrl" ind i Image-kontrollen?
Avatar billede fanatic Nybegynder
14. oktober 2007 - 09:37 #10
Ok, det virker med html-tagget img eks.:

<img src="Pictures/<%# DataBinder.Eval(Container.DataItem, "[\"pictureUrl\"]")%>" />
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