2009-07-09 102 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:#,###。##}」;

它適用於我。