更改枚举在DataGridView中显示的值

时间:2015-07-02 18:20:40

标签: c# winforms datagridview enums

我将DataGridView绑定到具有许多不同类型值(int,DateTime,字符串和枚举)的对象列表。对于大多数类型,显示的值是可以的,但不适用于枚举。我想在DataGridView中显示自定义名称(来自XmlEnumAttribute,具体而言,但我知道如何从中获取字符串)。我知道我将对象包装在另一个包含字符串而不是枚举的对象中,但我不想这样做。

因此,举例来说:当枚举的值为GeneralSurgery时,我希望DataGridView显示为General surgeryItem3060Minutes30-60 minutes等。

5 个答案:

答案 0 :(得分:3)

DataGridView如果分配了TypeConverter将使用PetTypeConverter。此Description将返回枚举[TypeConverter(typeof(PetTypeConverter))] public enum PetType { [Description("Kitty-cat")]Feline, [Description("doggie")]Canine, [Description("scary!")]Dragon, [Description("Extra-Terra")]Alien } class Pet { public string Name { get; set; } public PetType Species { get; set; } public Pet(string name, PetType p) { Name = name; Species = p; } } public class PetTypeConverter : TypeConverter { public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) { if (object.ReferenceEquals(destinationType, typeof(string))) { return true; } return base.CanConvertTo(context, destinationType); } public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) { if (object.ReferenceEquals(destinationType, typeof(string))) { FieldInfo fi = value.GetType().GetField(value.ToString()); DescriptionAttribute[] attr = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false); if (attr.Length > 0) { return attr[0].Description; } else { return value.ToString(); } } return base.ConvertTo(context, culture, value, destinationType); } }

enum

请注意,如果可以在DGV中编辑该属性,则还需要提供将描述转换回有效枚举值的方法。据推测,这将是一个Combo专栏,您可以提供所有描述,因此您只需要查找它。

结果:

enter image description here

如果在其他地方使用PetTypeConverter,您可能希望将PetType移至该属性,以便只转换asyncio.gather的使用情况。

答案 1 :(得分:2)

使用DataGridview的CellFormatting事件修改显示的值:

private void  dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    if (dataGridView1.Columns[e.ColumnIndex].name=="MyEnumColumnName")
    { 
       MyEnumType enumValue = (MyEnumType)e.value ;
       string enumstring = ... ; // convert here the enum to displayed string 
       e.Value = enumstring ;
     }
}

答案 2 :(得分:0)

不确定这是否是您想要的,但要获取枚举的字符串值

Enum.GetName(typeof(EnumType), enumVal);

你仍然需要格式化字符串

答案 3 :(得分:0)

因为您的DataGridView已绑定到自定义类型的List 其中一种方法可以添加一个readonly属性,该属性返回属性的值(XmlEnumAttribute

public string EnumValueDescription
{
    get { return this.GetAttributeOfSelectedEnumValue(); }
}

然后将此值绑定到DataGridValue

答案 4 :(得分:0)

正如@Graffito所说,您应该使用cellFormatting事件来处理枚举列的不同显示。然后,您可以使用反射来获取当前枚举值的属性,然后使用该属性描述

private void  dataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    if (dataGridView.Columns[e.ColumnIndex].Name == "MyEnumColumn")
    { 
       SomeEnum enumValue = (SomeEnum)e.value ;
       e.Value = ((XmlEnumAttribute)typeof(SomeEnum).GetMember(enumValue.ToString()).FirstOrDefault().GetCustomAttributes(typeof(XmlEnumAttribute)).FirstOrDefault()).Description ;
     }
}