绑定到ASP.NET GridView时的TypeConverter

时间:2009-12-17 17:41:37

标签: c# .net asp.net typeconverter

我正在尝试将对象的IList绑定到GridView的DataSource,并且该对象的一个​​属性是枚举。当对象绑定到GridView行时,我试图在枚举上使用TypeConverter来使用Description。看起来我的EnumConverter.ConvertTo方法看起来不像。将对象绑定到ASP.NET GridView时会自动调用TypeConverter吗?

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 个答案:

答案 0 :(得分:2)

不,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);

    }
}

您应该尊重encode参数,并执行指定的任何格式化......并且最好也为您的转换器实现CanConvertTo。

答案 1 :(得分:0)

我不认为GridView在绑定时会遇到TypeConverter属性,原因有两个:

  1. 会降低大型数据集的性能。
  2. 这会使数据在排序和分组方面不一致(数据源表示数据已经过排序,但由于转换器似乎没有排序)
  3. PS:你提到的这个转换器不会在任何地方工作。您必须实现“CanConvertTo”方法。

    PS2:实现自己想做的事情的一个好方法是实现自定义单元格模板。