30

How can I format data coming from a DataBinder.Eval statement in an ASPX page?

For example, I want to display the published date of the news items in a particular format in the homepage. I'm using the ASP.NET 2.0 Repeater control to show the list of news items.

The code for this goes like this:

<asp:Repeater ID="Repeater1" runat="server" DataSourceID="ObjectDataSource1">
<HeaderTemplate><table cellpadding="0" cellspacing="0" width="255"></HeaderTemplate>
<ItemTemplate>
    <tr><td >
            <a href='/content/latestNews.aspx?id=<%#DataBinder.Eval(Container.DataItem, "id") %>'>
                <asp:Label ID="lblNewsTitle" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "title") %>'></asp:Label>
            </a>
    </td></tr>
    <tr><td>
           <asp:Label ID="lblNewsDate" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "publishedDate"))%>'></asp:Label>
    </td></tr>
</ItemTemplate>
<FooterTemplate></table></FooterTemplate></asp:Repeater>

Is there a way I could call a custom method with the DataBinder.Eval value as its parameter (something like below)?

<asp:Label ID="lblNewsDate" runat="server" Text='<%# GetDateInHomepageFormat(DataBinder.Eval(Container.DataItem, "publishedDate")) )%>'></asp:Label>

If yes, then where do I write the GetDateInHomepageFormat method? I tried out in the code behind page but got a run time error? If this is not possible, is there a way to do inline formatting?

bkaid
  • 51,465
  • 22
  • 112
  • 128
Nahom Tijnam
  • 4,726
  • 5
  • 25
  • 25

10 Answers10

59

There is an optional overload for DataBinder.Eval to supply formatting:

<%# DataBinder.Eval(Container.DataItem, "expression"[, "format"]) %>

The format parameter is a String value, using the value placeholder replacement syntax (called composite formatting) like this:

<asp:Label id="lblNewsDate" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "publishedDate", "{0:dddd d MMMM}") %>'</label>
DOK
  • 32,337
  • 7
  • 60
  • 92
  • 2
    great answer... also worth while to add this link for all the C# String Format for DateTime at http://www.csharp-examples.net/string-format-datetime/ – naveen Jul 31 '10 at 10:51
  • Good answer, but I just want to point out that there is a missing '}' and a extra ']' at the end of the format expression in the label sample above. It should be: ..., "{0:dddd d MMMM}") %>' – PhillFox Dec 03 '10 at 17:20
  • 3
    Replying here because this is still high in Google results to this day. Keep in mind there is a performance penalty (because of the late binding) when using Eval. To format output I prefer passing an explicit cast to a function, eg. <%# Format(((DeliveryDataType)Container.DataItem).DeliveryDate, "dd.MM.yy")%> – ingredient_15939 Nov 03 '11 at 16:47
  • Instead of "expression"[, "format"]) it should be "expression", ["format"]) – sohaiby Jul 23 '13 at 08:26
14

After some searching on the Internet I found that it is in fact very much possible to call a custom method passing the DataBinder.Eval value.

The custom method can be written in the code behind file, but has to be declared public or protected. In my question above, I had mentioned that I tried to write the custom method in the code behind but was getting a run time error. The reason for this was that I had declared the method to be private.

So, in summary the following is a good way to use DataBinder.Eval value to get your desired output:

default.aspx

<asp:Label ID="lblNewsDate" runat="server" Text='<%# GetDateInHomepageFormat(DataBinder.Eval(Container.DataItem, "publishedDate")) )%>'></asp:Label>

default.aspx.cs code:

public partial class _Default : System.Web.UI.Page
{

    protected string GetDateInHomepageFormat(DateTime d)
    {

        string retValue = "";

        // Do all processing required and return value

        return retValue;
    }
}

Hope this helps others as well.

Nahom Tijnam
  • 4,726
  • 5
  • 25
  • 25
12

Why not use the simpler syntax?

<asp:Label id="lblNewsDate" runat="server" Text='<%# Eval("publishedDate", "{0:dddd d MMMM}") %>'</label>

This is the template control "Eval" that takes in the expression and the string format:

protected internal string Eval(
string expression,
string format

)

http://msdn.microsoft.com/en-us/library/3d2sz789.aspx

Diego C.
  • 2,271
  • 2
  • 20
  • 21
11

You can use a function into a repeater like you said, but notice that the DataBinder.Eval returns an object and you have to cast it to a DateTime.

You also can format your field inline:

<%# ((DateTime)DataBinder.Eval(Container.DataItem,"publishedDate")).ToString("yyyy-MMM-dd") %>

If you use ASP.NET 2.0 or newer you can write this as below:

<%# ((DateTime)Eval("publishedDate")).ToString("yyyy-MMM-dd") %>

Another option is to bind the value to label at OnItemDataBound event.

dexter
  • 1,217
  • 9
  • 12
3

This line solved my problem:

<%#DateTime.Parse(Eval("DDDate").ToString()).ToString("dd-MM-yyyy")%>
sth
  • 222,467
  • 53
  • 283
  • 367
  • @Wahab: Thats perfect as long as you are happy to do the formatting inline. However, the original question was how you could use a custom method to do the formatting. The idea being you could re-use the custom method and reduce complexity in the ASPX page. Cheers. – Nahom Tijnam Aug 20 '09 at 13:07
2

To format the date using the local date format use:

<%#((DateTime)Eval("ExpDate")).ToString("d")%>

How to Format an Eval Statement to Display a Date using Date Locale

Christian Specht
  • 35,843
  • 15
  • 128
  • 182
GMG
  • 31
  • 1
1

Text='<%# DateTime.Parse(Eval("LastLoginDate").ToString()).ToString("MM/dd/yyyy hh:mm tt") %>'

This works for the format as you want

Devendra Patel
  • 309
  • 2
  • 10
1

Thanks to all. I had been stuck on standard format strings for some time. I also used a custom function in VB.

Mark Up:-

<asp:Label ID="Label3" runat="server" text='<%# Formatlabel(DataBinder.Eval(Container.DataItem, "psWages1D")) %>'/>

Code behind:-

Public Function fLabel(ByVal tval) As String
   fLabel = tval.ToString("#,##0.00%;(#,##0.00%);Zero")
End Function
gaz
  • 11
  • 2
0
<asp:Label ID="ServiceBeginDate" runat="server" Text='<%# (DataBinder.Eval(Container.DataItem, "ServiceBeginDate", "{0:yyyy}") == "0001") ? "" : DataBinder.Eval(Container.DataItem, "ServiceBeginDate", "{0:MM/dd/yyyy}") %>'>
</asp:Label>
sth
  • 222,467
  • 53
  • 283
  • 367
0

You can use it this way in aspx page

<%# DataBinder.Eval(Container.DataItem, "DateColoumnName", "{0:dd-MMM-yyyy}") %>
rcollyer
  • 10,475
  • 4
  • 48
  • 75