2009-07-09 49 views
4

我有一个绑定到十进制值的BoundField的ASP.NET Gridview。我使用下面的代码,以十进制数字格式货币值:在DataFormatString上自定义NumberFormatInfo

DataFormatString="{0:C}" 

我们的NumberFormatInfo的自定义实现,虽然,这消除了货币符号和修改了数以千计的分隔符。通常这种格式应用为这样的:

myDecimal.ToString("C", myCustomNFI); 

如何在GridView的绑定列元素指定一个自定义的NumberFormatInfo?

感谢

回答

9

这可以使用自定义绑定字段来完成。从一个自定义的BoundField类开始。下面我试图按照你的命名约定。

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

在.aspx文件中注册的控制:

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

引用自定义的BoundField你的GridView中:

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

您将要玩里面FormatDataValue()的为了获得你想要的格式。

一对夫妇的意见:

  • 如果您希望自定义的BoundField来 处理多种格式,解析 base.DataFormatString得到 格式类型。换句话说,如果您在FormatDataValue中适应这种情况, 代码前端中提供{0:NFI}或{0:NFI2}的 可能会导致不同的 格式。

  • 你可能要考虑创建 自己的格式提供,而不是 把所有的格式化逻辑 的右内侧FormatDataValue 功能。

这种方法应该适合你。祝你好运。

+0

非常优雅的解决方案,谢谢Ben。 – staterium 2009-07-10 09:54:44

0

我不是100%肯定,但我不认为你可以。

您需要使用模板字段并使用自定义格式器绑定到RowDataBound上的文字。很高兴被证明错误,但是......

+0

真相被告知,我已经这样做了,因为我找不到任何其他方式来做到这一点。 覆盖CurrentCulture的NumberFormatInfo应该可以工作,但这是只读的,所以我放弃了这个列表。 其他人有一些输入? – staterium 2009-07-09 13:15:49

3

尝试使用field.DataFormatString = currencySymbol +“{0:#,###。##}”;

它适用于我。