This is what I’ve got. It works. But, is there a simpler or better way?
ASPX Page…
<asp:Repeater ID='RepeaterBooks' runat='server'> <HeaderTemplate> <table class='report'> <tr> <th>Published</th> <th>Title</th> <th>Author</th> <th>Price</th> </tr> </HeaderTemplate> <ItemTemplate> <tr> <td><asp:Literal ID='LiteralPublished' runat='server' /></td> <td><asp:Literal ID='LiteralTitle' runat='server' /></td> <td><asp:Literal ID='LiteralAuthor' runat='server' /></td> <td><asp:Literal ID='LiteralPrice' runat='server' /></td> </tr> </ItemTemplate> <FooterTemplate> </table> </FooterTemplate> </asp:Repeater>
ASPX.VB Code Behind…
Protected Sub Page_Load( ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Dim db As New BookstoreDataContext RepeaterBooks.DataSource = From b In db.Books _ Order By b.Published _ Select b RepeaterBooks.DataBind() End Sub Sub RepeaterBooks_ItemDataBound( ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles RepeaterBooks.ItemDataBound If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then Dim b As Book = DirectCast(e.Item.DataItem, Book) DirectCast(e.Item.FindControl('LiteralPublished'), Literal).Text = '<nobr>' + b.Published.ToShortDateString + '</nobr>' DirectCast(e.Item.FindControl('LiteralTitle'), Literal).Text = '<nobr>' + TryNbsp(HttpContext.Current.Server.HtmlEncode(b.Title)) + '</nobr>' DirectCast(e.Item.FindControl('LiteralAuthor'), Literal).Text = '<nobr>' + TryNbsp(HttpContext.Current.Server.HtmlEncode(b.Author)) + '</nobr>' DirectCast(e.Item.FindControl('LiteralPrice'), Literal).Text = '<nobr>' + Format(b.Price, 'c') + '</nobr>' End If End Sub Function TryNbsp(ByVal s As String) As String If s = '' Then Return ' ' Else Return s End If End Function
@Geoff
That sort of Eval statement was actually added in 2.0, but if performance is important Eval should be avoided since it uses Reflection.
The repeater is a pretty good way of doing it, although it might be faster to generate the table in code:
ASPX Page:
Code Behind:
I guess it depends on how important speed is to you. For simplicity’s sake I think I would go with the Repeater.