2008-11-08 14 views
29

Comment puis-je formater des données provenant d'une instruction DataBinder.Eval dans une page ASPX? Par exemple, je souhaite afficher la date de publication des actualités dans un format particulier sur la page d'accueil. J'utilise le contrôle Répéteur ASP.NET 2.0 pour afficher la liste des informations.Formatage des données DataBinder.Eval

Le code pour cela va comme ceci:

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

Est-il possible que je pourrais appeler une méthode personnalisée avec la valeur DataBinder.Eval comme paramètre (quelque chose comme ci-dessous)?

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

Si oui, où dois-je écrire la méthode GetDateInHomepageFormat? J'ai essayé dans le code derrière la page, mais j'ai une erreur d'exécution? Si ce n'est pas possible, existe-t-il un moyen de faire du formatage en ligne?

Répondre

57

Il y a une surcharge en option pour DataBinder.Eval pour fournir la mise en forme:

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

Le paramètre de format est une valeur de chaîne, en utilisant l'espace réservé valeur syntaxe de remplacement (appelée mise en forme composite) comme ceci:

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

grande réponse ... également la peine d'ajouter ce lien f ou tout le format C# String pour DateTime à http://www.csharp-examples.net/string-format-datetime/ – naveen

+0

Bonne réponse, mais je veux juste faire remarquer qu'il y a un '}' et un 'manquant' ] 'à la fin de l'expression de format dans l'exemple d'étiquette ci-dessus. Il devrait être: ..., "{0: dddd d MMMM}")%> ' – PhillFox

+0

@PhillFox Bonne prise. Merci, je l'ai réparé. – DOK

11

Vous pouvez utiliser une fonction dans un répéteur comme vous l'avez dit, mais notez que DataBinder.Eval renvoie un objet et que vous devez le convertir en DateTime.

Vous pouvez également formater votre ligne de champ:

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

Si vous utilisez ASP.NET 2.0 ou plus récente, vous pouvez écrire comme ci-dessous:

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

Une autre option consiste à lier la valeur à label à l'événement OnItemDataBound.

+0

Parfait! C'est ce dont j'ai besoin – Khaneddy2013

14

Après quelques recherches sur Internet, j'ai trouvé que il est en fait très possible d'appeler une méthode personnalisée en transmettant la valeur DataBinder.Eval.

La méthode personnalisée peut être écrit dans le fichier code-behind, mais doit être déclarée publique ou protégés. Dans ma question ci-dessus, j'avais mentionné que j'avais essayé d'écrire la méthode personnalisée dans le code, mais que je recevais une erreur d'exécution. La raison en était que j'avais déclaré la méthode privée.

Donc, en résumé ce qui suit est une bonne façon d'utiliser la valeur DataBinder.Eval pour obtenir votre sortie désirée:

default.aspx

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

code 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; 
    } 
} 

Espérons que cela aide aussi les autres.

3

Cette ligne a résolu mon problème:

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

@Wahab: C'est parfait tant que vous êtes heureux de faire le formatage en ligne. Cependant, la question initiale était comment vous pourriez utiliser une méthode personnalisée pour effectuer le formatage. L'idée étant que vous puissiez réutiliser la méthode personnalisée et réduire la complexité de la page ASPX. À votre santé. –

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

Cela vérifie si la date est NULL et si ses formats Not it et stocke la date! –

0

Vous pouvez l'utiliser de cette façon dans la page ASPX

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

Pourquoi ne pas utiliser la syntaxe plus simple?

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

C'est le contrôle du modèle "Eval" qui prend dans l'expression et le format de la chaîne:

protected internal string Eval(
string expression, 
string format 

)

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

1

Merci à tous. J'avais été coincé sur des chaînes de format standard pendant un certain temps. J'ai également utilisé une fonction personnalisée dans VB.

Mark Up: -

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

derrière: -.

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

Text = » <% # DateTime.Parse (. Eval ("dateConnexionPrecedente") ToString()) ToString ("mM/jj/aaaa hh: mm tt")%> »

cela fonctionne pour le format que vous voulez