TypeConverter при привязке к ASP.NET GridView - PullRequest
2 голосов
/ 17 декабря 2009

Я пытаюсь связать IList объектов с источником данных GridView, и одним из свойств объекта является enum. Я пытался использовать TypeConverter в перечислении, чтобы использовать описание, когда объект привязан к строке GridView. Это не похоже на то, что мой EnumConverter.ConvertTo метод вызывается. Будет ли TypeConverter вызываться автоматически при привязке объекта к ASP.NET GridView?

ENUM:

[TypeConverter(typeof(AuditReasonConverter))]
    public enum AuditReason
    {
        [System.ComponentModel.Description("Successful Login")]
        SuccessfulLogin,
        [System.ComponentModel.Description("Failed Login")]
        FailedLogin,
        [System.ComponentModel.Description("New User")]
        NewUser,
        [System.ComponentModel.Description("Edited User")]
        EditedUser
    }

Класс TypeConverter:

public class AuditReasonConverter : EnumConverter
    {
        public AuditReasonConverter()
            : base(
                typeof(Blah.Core.AuditItem.AuditReason))
        { }

        public override object ConvertTo(ITypeDescriptorContext context,
            System.Globalization.CultureInfo culture, object value,
            System.Type destinationType)
        {
            if (destinationType == typeof(string))
            {
                return Utilities.GetEnumerationDescription(typeof(Blah.Core.AuditItem.AuditReason), value);  // your code here
            }
            return base.ConvertTo(context, culture, value, destinationType);
        }
    }

Ответы [ 2 ]

2 голосов
/ 18 декабря 2009

Нет, GridView, похоже, просто использует ToString.

Что я сделал, так это подкласс BoundField (или DataControlField = больше работы) и использовал ваш конвертер в FormatDataValue -

public class ConverterBoundField : BoundField
{
    protected override string FormatDataValue(object dataValue, bool encode)
    {
        TypeConverter converter = TypeDescriptor.GetConverter(dataValue.GetType());
        if (converter.CanConvertTo(typeof(string)))
        {
            return converter.ConvertToString(dataValue);
        }
        return base.FormatDataValue(dataValue, encode);

    }
}

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

0 голосов
/ 18 декабря 2009

Я не думаю, что GridView беспокоится об атрибуте TypeConverter при связывании по 2 причинам:

  1. Это снизит производительность в больших наборах данных.
  2. Это может привести к несогласованности данных в отношении сортировки и группировки (источник данных говорит, что данные были доставлены отсортированными, но, похоже, они не отсортированы из-за конвертера)

PS: упомянутый вами конвертер не будет работать нигде. Вы должны реализовать метод CanConvertTo.

PS2. Хороший подход к выполнению того, что вы хотите, - это реализовать собственный шаблон ячейки.

...