【问题标题】:TypeConverter when binding to ASP.NET GridView绑定到 ASP.NET GridView 时的 TypeConverter
【发布时间】:2009-12-17 17:41:36
【问题描述】:

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

枚举:

[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);
        }
    }

【问题讨论】:

  • successfull 应该是成功的 - 至少在英国 ;-)
  • 是的....需要改进我的拼写...:)

标签: c# .net asp.net typeconverter


【解决方案1】:

不,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。

【讨论】:

    【解决方案2】:

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

    1. 这会降低大型数据集的性能。
    2. 这会使数据在排序和分组方面不一致(数据源表示数据已排序,但由于转换器,它似乎没有排序)

    PS:你提到的这个转换器不能在任何地方工作。您必须实现“CanConvertTo”方法。

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

    【讨论】:

    • 我在绑定到组合框时使用了这种方法,我目前正在使用模板字段并在 ItemTemplate 中进行格式化。我可以在 ItemTemplate 中做到这一点,所以不确定你的理由 #1 是否准确,因为我本质上正在做同样的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多