Avatar billede nielsbrinch Nybegynder
08. december 2003 - 14:38 Der er 12 kommentarer og
2 løsninger

Brug af Repeater

Jeg har to instanser af følgende klasse, som jeg gerne vil vise på min webside ved hjælp af en Repeater. Jeg har fulgt en guide fra Microsoft og har prøvet med en anden guide jeg fandt et sted. Lige meget hjælper det, jeg får vist Header og Footer i repeateren, men ingen Items vises.

public class Booking
{
    private DateTime date;
    private int track;

    public Booking(DateTime date, int track)
    {
        this.date = date;
        this.track = track;
    }

    public DateTime Date {
        get {
            return date;
        }
    }

    public int Track {
        get {
            return track;
        }
    }
}

I min oversigt.aspx hvor jeg vil bruge selve repeateren, har jeg følgende kode:

<asp:Repeater id=Repeater1 runat="server">
    <HeaderTemplate>
        <table border="1">
        <tr>
        <td><b>Track</b></td>
        <td><b>Date</b></td>
        </tr>
    </HeaderTemplate>
    <ItemTemplate>
        <tr>
        <td>
        <%# DataBinder.Eval(Container.DataItem, "Track") %>
        </td>
        <td>
        <%# DataBinder.Eval(Container.DataItem, "Date") %>
        </td>
        </tr>
    </ItemTemplate>
    <FooterTemplate>
        </table>
    </FooterTemplate>
</asp:Repeater>

I øvrigt med følgende i toppen af oversigt.aspx:
<%@ Page language="c#" Codebehind="oversigt.aspx.cs" AutoEventWireup="True" Inherits="Squash.oversigt" %>

i oversigt.aspx.cs har jeg så følgende:

protected System.Web.UI.WebControls.Repeater Repeater1;
public ArrayList bookings;
private void Page_Load(object sender, System.EventArgs e) {
    ArrayList bookings = F.GetBookings();
    Repeater1.DataSource = bookings;
    Repeater1.DataBind();
}

Der ER to instanser af Booking i 'bookings', jeg har tjekket.

Som sagt får jeg vist Header og Footer, men får ikke vist nogle Items, som om der slet ikke er nogen. Hvad gør jeg galt? Jeg har aldrig prøvet at bruge en Repeater før, så det kan godt være noget ganske banalt jeg gør galt.
Avatar billede mufoxe Nybegynder
08. december 2003 - 14:53 #1
Prøv at erstatte
DataBinder.Eval(Container.DataItem, "Track") med Container.DataItem.Track
Og
DataBinder.Eval(Container.DataItem, "Date") med Container.DataItem.Date

Evt. m. ToString() på.
Avatar billede burningice Nybegynder
08. december 2003 - 15:15 #2
problemet ligger i at du bruger en ArrayList som datasource... din repeater vil ikke kunne se objecterne i den som Booking-objecter. lav istedet en Strong-typed collection som du kan gemme dine Booking-objecter i. Det er meget nemt, da du kan arve fra System.Collections.CollectionBase og nøjes med at override Add og Get metoderne
Avatar billede nielsbrinch Nybegynder
08. december 2003 - 15:36 #3
Jeg får følgende fejl på denne linje: <%# Container.DataItem.Track %>

Compiler Error Message: CS0117: 'object' does not contain a definition for 'Track'

Jeg skal vel typecaste på en eller anden måde så?
((Booking)Container.DataItem).Track virkede heller ikke.
Avatar billede nielsbrinch Nybegynder
08. december 2003 - 15:40 #4
Fessor, jeg havde ikke lige set din kommentar da jeg sendte min besked - jeg prøver lige at hitte ud af at lave en BookingCollection, så.
Avatar billede nielsbrinch Nybegynder
08. december 2003 - 15:56 #5
Det virker ikke. Jeg binder nu følgende til min Repeater:

public class BookingCollection : System.Collections.CollectionBase
  {
  public Booking this[int index]  {
    get  {
      return((Booking)List[index]);
    }
      set  {
        List[index] = value;
      }
  }

  public int Add(Booking value)  {
    return(List.Add(value));
  }
}

I min oversigt.aspx.cs ser det nu sådan ud:

public BookingCollection bookings;
private void Page_Load(object sender, System.EventArgs e)
{
  bookings = new BookingCollection();
  bookings.Add(new Booking(new DateTime(0), 3));
  bookings.Add(new Booking(new DateTime(0), 2));
  Repeater1.DataSource = bookings;
  Repeater1.DataBind();
}

I oversigt.aspx står det ligesom mufoxe foreslog
Avatar billede mufoxe Nybegynder
08. december 2003 - 15:56 #6
Ah ja, vi glæder os til Whidbey og Generics :)
Avatar billede nielsbrinch Nybegynder
08. december 2003 - 16:03 #7
Ahva'?
Avatar billede nielsbrinch Nybegynder
08. december 2003 - 17:34 #8
Jeg har i øvrigt op til flere eksempler som viser man kan gøre sådan:

protected void Page_Load(object sender,EventArgs e)
{
  ArrayList al=new ArrayList();
  for(int i=1;i<10;i++)
    al.Add(new AddressBook("Name#" + i.ToString(),"mail@mail" + i.ToString()));
  Repeater.DataSource=al;
  Repeater.DataBind();
}

Der kan de altså godt bruge en ArrayList...
Avatar billede mufoxe Nybegynder
08. december 2003 - 18:07 #9
Prøv mit eksempel fra før men med
( ( Booking ) Container.DataItem ).Track
Avatar billede nielsbrinch Nybegynder
08. december 2003 - 18:17 #10
Det prøvede jeg 15:36:51, men det virkede ikke, den kender ikke Booking. Skal man importere et eller andet i aspx-filen for at kunne se objekterne?
Avatar billede nielsbrinch Nybegynder
08. december 2003 - 18:21 #11
CS0246: The type or namespace name 'Booking' could not be found (are you missing a using directive or an assembly reference?)
Avatar billede nielsbrinch Nybegynder
08. december 2003 - 18:27 #12
Jeg brugte ((Squash.Booking)Container.DataItem).Track

Det virker.

(Squash er det namespace mit system ligger i)
Avatar billede nielsbrinch Nybegynder
08. december 2003 - 18:28 #13
Det er vist fair nok :-) mange tak for hjælpen, mufoxe!
Avatar billede mufoxe Nybegynder
08. december 2003 - 20:23 #14
mange tak :)
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