4

我有一个带有绑定到十进制值的 BoundField 的 ASP.NET Gridview。我使用以下代码将十进制数格式化为货币值:

DataFormatString="{0:C}"

不过,我们有一个 NumberFormatInfo 的自定义实现,它删除了货币符号并修改了千位分隔符。通常这种格式是这样应用的:

myDecimal.ToString("C", myCustomNFI);

如何在 Gridview 的 BoundField 元素上指定自定义 NumberFormatInfo?

谢谢

4

3 回答 3

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

引用 GridView 中的自定义 BoundField:

<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 函数中。

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

于 2009-07-09T22:06:20.733 回答
4

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

这对我来说可以。

于 2011-05-25T07:35:49.063 回答
0

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

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

于 2009-07-09T13:09:28.730 回答