Пользовательский NumberFormatInfo для DataFormatString - PullRequest
4 голосов
/ 09 июля 2009

У меня есть ASP.NET Gridview с BoundField, который связан с десятичным значением. Я использую следующий код для форматирования десятичного числа в значение валюты:

DataFormatString="{0:C}"

У нас есть специальная реализация NumberFormatInfo, которая удаляет символ валюты и модифицирует разделитель тысяч. Обычно этот формат применяется как таковой:

myDecimal.ToString("C", myCustomNFI);

Как указать пользовательский NumberFormatInfo для элемента BoundField в Gridview?

Спасибо

Ответы [ 3 ]

9 голосов
/ 10 июля 2009

Это можно сделать с помощью настраиваемого связанного поля. Начните с пользовательского класса 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, чтобы получить тип форматирования. Другими словами, предоставление {0: NFI} или {0: NFI2} в код фронта может привести к другому форматы, если вы учитываете это в FormatDataValue.

  • Вы можете рассмотреть возможность создания ваш собственный поставщик форматов, а не размещение всей вашей логики форматирования прямо внутри FormatDataValue функция.

Этот подход должен работать для вас просто отлично. Желаем удачи.

3 голосов
/ 25 мая 2011

Попробуйте с field.DataFormatString = currencySymbol + "{0: #, ###. ##}";

У меня отлично работает.

0 голосов
/ 09 июля 2009

Я не уверен на 100%, но не думаю, что вы можете.

Вам нужно будет использовать поле шаблона и связать его с литералом в RowDataBound, вместо этого используя свой пользовательский форматтер. Рад, что, однако, оказался неправ ...

...