2008-11-08 12 views
29

Jak sformatować dane pochodzące z instrukcji DataBinder.Eval na stronie ASPX?Formatowanie DataBinder.Eval danych

Na przykład chcę wyświetlić opublikowaną datę wiadomości w określonym formacie na stronie głównej. Używam kontrolki Repeater ASP.NET 2.0, aby wyświetlić listę elementów wiadomości.

Kod za tym idzie tak:

<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> 

Czy istnieje sposób mogę nazwać niestandardową metodę z wartością DataBinder.Eval jako parametr (coś jak poniżej)?

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

Jeśli tak, to gdzie mam napisać metodę GetDateInHomepageFormat? Próbowałem w kodzie za stroną, ale dostałem błąd czasu wykonywania? Jeśli nie jest to możliwe, czy istnieje sposób na formatowanie wbudowane?

Odpowiedz

57

Jest to opcjonalny przeciążenie dla DataBinder.Eval dostarczyć formatowanie:

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

Parametr format jest wartość String, używając wartości odtworzeniowej zastępczy składni (tzw formatowanie kompozytowe) tak:

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

wielką odpowiedź ... także warto dodać link do tej f lub cały format C# String dla DateTime pod adresem http://www.csharp-examples.net/string-format-datetime/ – naveen

+0

Dobra odpowiedź, ale chcę tylko podkreślić brakujący "}" i dodatkowy " ] "na końcu wyrażenia formatu w powyższym przykładzie etykiety. Powinno to być: ..., "{0: dddd d MMMM}")%> ' – PhillFox

+0

@PhillFox Dobry połów. Dzięki, naprawiłem to. – DOK

11

Możesz użyć funkcji do repetytora, tak jak powiedziałeś, ale zauważ, że DataBinder.Eval zwraca obiekt i musisz go przesłać do DateTime.

Można także sformatować inline polu:

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

Jeśli używasz ASP.NET 2.0 lub nowszej można napisać to jak poniżej:

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

Inną opcją jest do wiązania wartości etykieta w zdarzeniu OnItemDataBound.

+0

Idealnie! To jest to, czego potrzebuję. – Khaneddy2013

14

Po pewnym przeszukaniu w Internecie okazało się, że jest w istocie bardzo możliwe wywołanie niestandardowej metody przekazującej wartość DataBinder.Eval.

Sposób zwyczaj może być napisany w kodzie za plik, ale musi być zadeklarowane publicznego lub chroniony. W moim pytaniu powyżej wspomniałem, że próbowałem napisać niestandardową metodę w kodzie, ale otrzymałem błąd czasu wykonywania. Powodem tego było to, że zadeklarowałem, że metoda ma być prywatna.

Tak, w skrócie po to dobry sposób na wykorzystanie wartości DataBinder.Eval aby uzyskać pożądany wynik:

default.aspx

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

kod default.aspx.cs:

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

    protected string GetDateInHomepageFormat(DateTime d) 
    { 

     string retValue = ""; 

     // Do all processing required and return value 

     return retValue; 
    } 
} 

Mam nadzieję, że to pomaga także innym.

3

Linia ta rozwiązać mój problem:

<%#DateTime.Parse(Eval("DDDate").ToString()).ToString("dd-MM-yyyy")%> 
+0

@Wahab: To jest idealne, o ile z przyjemnością zrobisz formatowanie w linii. Jednak pierwotne pytanie brzmiało, jak można użyć niestandardowej metody do formatowania. Pomysł polegał na tym, że można ponownie użyć niestandardowej metody i zmniejszyć złożoność na stronie ASPX. Twoje zdrowie. –

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> 
+2

+0

Sprawdza, czy data ma wartość NULL i czy jej formatowanie nie jest przechowuje datę! –

0

można go używać w ten sposób na stronie aspx

<%# DataBinder.Eval(Container.DataItem, "DateColoumnName", "{0:dd-MMM-yyyy}") %> 
12

Dlaczego nie użyć prostszej składni?

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

Jest to kontrola szablon "eval", który odbywa się w wypowiedzi i format ciągu:

protected internal string Eval(
string expression, 
string format 

)

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

1

Dziękuję wszystkim. Od jakiegoś czasu utknąłem w standardowym formacie. Użyłem też niestandardowej funkcji w VB.

Mark Up: -

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

Kod za: - (. Eval ("lastlogindate") toString()).

Public Function fLabel(ByVal tval) As String 
    fLabel = tval.ToString("#,##0.00%;(#,##0.00%);Zero") 
End Function 
1

Text =”<% # DateTime.Parse toString ("mM/dd/yyyy hh: mm TT")%>”

działa to dla formatu jak chcesz