2009-07-09 6 views
4

J'ai un Gridview ASP.NET avec un BoundField lié à une valeur décimale. J'utiliser le code suivant pour formater le nombre décimal à une valeur monétaire:NuméroFormatInfo personnalisé sur DataFormatString

DataFormatString="{0:C}" 

Nous avons une implémentation personnalisée de NumberFormatInfo bien, ce qui supprime le symbole monétaire et modifie les milliers seperator. Normalement, ce format est appliqué en tant que tel:

myDecimal.ToString("C", myCustomNFI); 

Comment puis-je spécifier un NumberFormatInfo de mesure sur l'élément BoundField du Gridview?

Merci

Répondre

9

Cela peut être fait en utilisant un champ lié personnalisé. Commencez avec une classe BoundField personnalisée. Ci-dessous j'ai essayé de suivre votre convention de nommage.

namespace CustomBoundField 
{ 
    public class NFIBoundField : System.Web.UI.WebControls.BoundField 
    { 
     protected override string FormatDataValue(object dataValue, bool encode) 
     { 
      if (dataValue == null || dataValue == System.DBNull.Value) 
       return ""; 

      if (base.DataFormatString == string.Empty) 
       return dataValue.ToString(); 

      // Format as you wish based on dataValue and DataFormatString argument 
      return string.Format("{0}", dataValue); 
     } 
    } 
} 

Enregistrez le contrôle dans votre fichier .ASPX:

<%@ Register Namespace="CustomBoundField" TagPrefix="custom" %> 

Référence la coutume BoundField dans votre GridView:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false"> 
    <Columns> 
     <custom:NFIBoundField DataField="Price" HeaderText="Price" DataFormatString="{0:NFI}"/> 
    </Columns> 
</asp:GridView> 

Vous voulez jouer à l'intérieur de FormatDataValue() dans afin d'obtenir le format que vous voulez.

Quelques commentaires:

  • Si vous voulez que votre BoundField personnalisé pour gérer plusieurs formats, analyser base.DataFormatString pour obtenir le type de formatage . En d'autres termes, en fournissant {0: NFI} ou {0: NFI2} dans le front de code peut aboutir à différents formats si vous acceptez cela dans FormatDataValue.

  • Vous voudrez peut-être envisager de créer votre propre fournisseur de format plutôt que placer l'ensemble du formatage logique à l'intérieur de la fonction FormatDataValue .

Cette approche devrait fonctionner pour vous. Bonne chance.

+0

Solution très élégante, merci Ben. – staterium

+0

Vous êtes les bienvenus. Je suis heureux d'aider. –

0

Je ne suis pas sûr à 100% mais je ne pense pas que vous pouvez.

Vous devrez utiliser un champ de modèle et lier un littéral sur RowDataBound à l'aide de votre formateur personnalisé. Heureux d'être prouvé faux cependant ....

+0

En vérité, je l'ai déjà fait, parce que je n'ai pas trouvé d'autre moyen de le faire. Le remplacement de la fonction NumberFormatInfo de CurrentCulture devrait fonctionner, mais c'est en lecture seule, donc j'ai également abandonné ce train. Quelqu'un d'autre a quelque chose à ajouter? – staterium

3

Essayez avec field.DataFormatString = currencySymbol + "{0: #, ###. ##}";

Cela fonctionne très bien pour moi.