Вопрос

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

DataFormatString="{0:C}"

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

myDecimal.ToString("C", myCustomNFI);

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

Спасибо

Это было полезно?

Решение

Это можно сделать с помощью настраиваемого связанного поля.Начните с пользовательского класса 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(), чтобы получить нужное форматирование.

Пара комментариев:

  • Если вы хотите, чтобы ваше пользовательское границу обрабатывало несколько форматов, parse base.dataformatstring, чтобы получить тип форматирования.Другими словами, предоставление {0: nfi} или {0: nfi2} в фронте кода может привести к различным форматам, если вы приспосабливаетесь к этому в Formatdatavalue.

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

Этот подход должен вам подойти.Удачи.

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top