Sur mesure NumberFormatInfo DataFormatString
-
12-09-2019 - |
Question
I ai un ASP.NET Gridview avec un BoundField qui est lié à une valeur décimale. J'utilise le code suivant pour formater le nombre décimal à une valeur monétaire:
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 personnalisé sur l'élément BoundField du Gridview?
Merci
La solution
Cela peut être fait en utilisant un champ lié personnalisé. Commencez par une classe BoundField personnalisée. Ci-dessous je tentais 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 () afin d'obtenir la mise en forme que vous voulez.
Quelques commentaires:
-
Si vous voulez que votre BoundField personnalisé à gérer plusieurs formats, analyser base.DataFormatString pour obtenir le le type de mise en forme. En d'autres termes, fournir {0: NFI} ou {0: IFN2} dans le code avant pourrait entraîner différents formats si vous accueillerons pour cela dans FormatDataValue.
-
Vous voudrez peut-être envisager de créer votre propre fournisseur de format plutôt que placer l'ensemble de votre logique de formatage à l'intérieur de la FormatDataValue fonction.
Cette approche devrait travailler pour vous bien. Bonne chance.
Autres conseils
Essayez avec field.DataFormatString = currencySymbol + "{0:. #, ### ##}";
Il fonctionne très bien pour moi.
Je ne suis pas sûr à 100% mais je ne pense pas que vous pouvez.
Vous aurez besoin d'utiliser un champ de modèle et de se lier à un littéral RowDataBound au lieu d'utiliser votre formatter personnalisé. Heureux d'être mal mais .... prouvé