我将DataGridView绑定到具有许多不同类型值(int,DateTime,字符串和枚举)的对象列表。对于大多数类型,显示的值是可以的,但不适用于枚举。我想在DataGridView中显示自定义名称(来自XmlEnumAttribute
,具体而言,但我知道如何从中获取字符串)。我知道我将对象包装在另一个包含字符串而不是枚举的对象中,但我不想这样做。
因此,举例来说:当枚举的值为GeneralSurgery
时,我希望DataGridView
显示为General surgery
,Item3060Minutes
如30-60 minutes
等。
答案 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专栏,您可以提供所有描述,因此您只需要查找它。
结果:
如果在其他地方使用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 ;
}
}