2010-12-16 2 views
2

Je possède ce code dans un itemtemplate dans un gridview:Asp.net grdiview: puis-je formater les dataitems dans un itemtemplate?

<%# DataBinder.Eval (Container.DataItem, "DiscountAmount")%> 

Il est une valeur décimale, et il montre 20,300000000000, ce qui est techniquement juste, mais je préfère montrer 20,30 ou 20,30, selon la culture.

Mais je n'ai jamais été un grand fan de gridviews, et le DataBinder.Eval et Container.DataItem n'ont pas été bons amis non plus, et je suis perdu avec la façon de l'utiliser.

il a un préfixe spécial (<% de #) et quand je tape autre chose, puis le code d'origine, il est pas bon, mais en changeant <% à # <% = ou <% ne semble pas fonctionner non plus?

+0

[Voir ici pour une solution complète avec l'exemple] (http://www.codeshower.blogspot.in/2012/10/datetime-format-in-gridview.html) –

Répondre

3

Cela permettra également de travailler:

<%#= String.Format("{0, 0:N2}",DataBinder.Eval (Container.DataItem, "DiscountAmount"))%> 

Modifier: Je partage votre malaise avec la syntaxe déclarative de liaison de données. Vous pouvez effectuer la même chose dans le code en appelant l'événement RowDataBound et en implémentant les modifications que vous souhaitez apporter lorsque les données sont liées au GridViewRow.

Pour ce faire, vous devez câbler l'événement dans le balisage en mettant OnRowDataBound au nom de votre gestionnaire d'événements, quelque chose comme ceci:

<asp:GridView ID="InvoiceGrid" OnRowDataBound="InvoiceGrid_RowDataBound".....> 

Ensuite, vous créez un gestionnaire d'événements dans le code derrière avec une signature comme celui-ci:

protected void InvoiceGrid_RowDataBound(object sender, GridViewRowEventArgs e) 

La première chose que vous faites dans ce gestionnaire d'événements est le test quel type de type GridViewRow est:

if (e.Row.RowType == DataControlRowType.DataRow).... 

Ensuite, vous faites le formatage que vous voulez faire.

Pour les personnes satisfaites du balisage déclaratif, cela peut sembler fastidieux. Mais pour les gens qui sont à l'aise d'écrire du code, vous pouvez en faire beaucoup plus ici dans le code derrière.

+0

puis obtenir le contrôle avec findcontrol sur le e? – Michel

+1

Oui, FindControl ou vous pouvez tricher et faire e.Row.Cells [1] .Text = "du texte" mais cela va casser si vous changez les colonnes. Vérifiez cela pour d'autres idées http://authors.aspalliance.com/aspxtreme/sys/web/ui/webcontrols/GridViewClassRowDataBound.aspx – DOK

+0

Assurez-vous simplement de l'écrire dans votre code côté client comme ça: <% # String.Format ("{0, 0: N2}", DataBinder.Eval (Container.DataItem, "COLUMN_NAME"))%> – M009

3

Avez-vous essayé?

<%= String.Format("{0:0,0.00}", DataBinder.Eval (Container.DataItem, "DiscountAmount"))%> 

ou tout simplement

<%# DataBinder.Eval(Container.DataItem, "DiscountAmount", "{0:0,0.00}") 

Vous pouvez lire plus d'options de format dans l'article String Format for Double.

+0

Cela devrait fonctionner aussi : '<% # DataBi nder.Eval (Container.DataItem, "DiscountAmount", "{0: 0,0.00}")%> '(c'est-à-dire appelez simplement la fonction surchargée). –

+0

Et comment ferais-je cela avec un cultureinfo? – Michel

2

Il y a plusieurs façons ...certains d'entre eux indiqué ci-dessus et voici un autre:

Text='<%# GetFormattedDiscount(Eval("DiscountAmount").ToString())%>' 

GetFormattedDiscout est une fonction dans votre code-behind où vous pouvez faire tout formatage dont vous avez besoin et de le retourner sous forme de chaîne:

protected void GetFormattedDiscount(string amount){ 
return String.Format("{0:N2}",amount); 
} 

Même cette devrait fonctionner:

<ItemTemplate> 
<asp:Label ID="Label1" runat="server" Text='<%#String.Format("{0:n2}",Eval("DiscountAmount")) %>'></asp:Label> 
</ItemTemplate> 
Questions connexes