带有枚举值的C#Propertygrid组合框(Win表单)
propertygrid类中的代码:带有枚举值的C#Propertygrid组合框(Win表单),c#,windows,forms,enums,propertygrid,C#,Windows,Forms,Enums,Propertygrid,propertygrid类中的代码: public enum eVisualType { None = 0, Torch = 1, Rune01, Rune02, Rune03, FireRed01, LaserBlackWhiteLeft, LaserBlackWhiteRight, LaserBlueRedLeft, LaserBlueRedRight, Wheel01, Wheel01a, Wheel02, BlinkingStar, MovingPillar }
public enum eVisualType
{
None = 0, Torch = 1, Rune01, Rune02, Rune03, FireRed01,
LaserBlackWhiteLeft, LaserBlackWhiteRight, LaserBlueRedLeft, LaserBlueRedRight,
Wheel01, Wheel01a, Wheel02, BlinkingStar, MovingPillar
}
public class EnumTypeConverter : TypeConverter
{
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true; // True means show a combobox
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true; // True will limit to list. false will show the list, but allow free-formentry
}
}
public class VisualTypeConverter : EnumTypeConverter
{
public override TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
return new StandardValuesCollection(new eVisualType[] { eVisualType.BlinkingStar, eVisualType.FireRed01, eVisualType.LaserBlackWhiteLeft, eVisualType.LaserBlackWhiteRight, eVisualType.LaserBlueRedLeft, eVisualType.LaserBlueRedRight, eVisualType.MovingPillar, eVisualType.Rune01, eVisualType.Rune02, eVisualType.Rune03, eVisualType.Torch, eVisualType.Wheel01, eVisualType.Wheel01a, eVisualType.Wheel02 });
}
public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
{
if(value is string)
return (eVisualType)Enum.Parse(typeof(eVisualType), value.ToString(), true);
return base.ConvertFrom(context, culture, value);
}
}
在运行时在propertygrid中选择其他值时,上述操作仍会产生错误:“System.String”类型的对象无法转换为“[project name].eVisualType”类型
这个问题以前被问过一两次,但从来没有完全详细过,或者只针对WPF+绑定。我使用Windows窗体
我也不确定是否需要ConvertFrom(..)。通过反射尝试:
private eVisualType m_VisualType = eVisualType.FireRed01;
[CategoryAttribute("Basic"), DescriptionAttribute("The visual type.")]
[TypeConverter(typeof(VisualTypeConverter))]
[DisplayName("Visual Type")]
public eVisualType VisualType
{
get { return m_VisualType; }
set { m_VisualType = value; }
}
public static T GetEnumMemberFromName(字符串名称)
{
返回(T)Enum.Parse(typeof(T),name);
}
在代码中:
public static T GetEnumMemberFromName<T>(string name)
{
return (T)Enum.Parse(typeof(T), name);
}
公共类VisualTypeConverter:EnumTypeConverter
{
public override TypeConverter.StandardValues集合GetStandardValues(ITypeDescriptor上下文)
{
返回新的标准值集合(新的设备类型[]{eVisualType.BlinkingStar,eVisualType.FireRed01,eVisualType.LaserBlackWhiteLeft,eVisualType.LaserBlackWhiteRight,eVisualType.LaserBlueRedLeft,eVisualType.LaserBlueRedRight,eVisualType.movingpall,eVisualType.rune1,eVisualType.Rune03,eVisualType.Torch,eVisualType.Wheel01,eVisualType.Wheel01a,eVisualType.Wheel02});
}
公共T GetEnumMemberFromName(字符串名称)
{
返回(T)Enum.Parse(typeof(T),name);
}
}
例如:
public class VisualTypeConverter : EnumTypeConverter
{
public override TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
return new StandardValuesCollection(new eVisualType[] { eVisualType.BlinkingStar, eVisualType.FireRed01, eVisualType.LaserBlackWhiteLeft, eVisualType.LaserBlackWhiteRight, eVisualType.LaserBlueRedLeft, eVisualType.LaserBlueRedRight, eVisualType.MovingPillar, eVisualType.Rune01, eVisualType.Rune02, eVisualType.Rune03, eVisualType.Torch, eVisualType.Wheel01, eVisualType.Wheel01a, eVisualType.Wheel02 });
}
public T GetEnumMemberFromName<T>(string name)
{
return (T)Enum.Parse(typeof(T), name);
}
}
eVisualType myEnumMember=myVisualTypeConverterInstance.GetEnumMemberFromName(“Torch”);
TypeConverter坏了(我需要从EnumConverter而不是TypeConverter中删除)
eVisualType myEnumMember = myVisualTypeConverterInstance.GetEnumMemberFromName<eVisualType>("Torch");
不清楚您真正想要什么,最好告诉我们这件事是如何开始的,结果是什么。我需要在属性网格中显示枚举值的组合框。但它也应该是枚举而不是字符串。因此myPropGrid.VisualType应该是eVisual类型的枚举,而不是字符串。当前的结果是er崩溃问题中提到的ror。抱歉,我需要更多的信息。我在哪里调用此函数?抱歉,仍然存在相同的错误。可能我做错了什么。但是GetEnumMemberFromName只是以通用方式将字符串转换为适当的枚举值。因此,结果与我以前的ConvertFrom()相同我仍然认为问题在于getter/setter中的某个地方,propertygrid本身只接受字符串值或其他什么?
using System;
using System.ComponentModel;
using System.Globalization;
using System.Reflection;
namespace [namespace]
{
public class EnumTypeConverter : EnumConverter
{
private Type m_EnumType;
public EnumTypeConverter(Type type)
: base(type)
{
m_EnumType = type;
}
public override bool CanConvertTo(ITypeDescriptorContext context, Type destType)
{
return destType == typeof(string);
}
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destType)
{
FieldInfo fi = m_EnumType.GetField(Enum.GetName(m_EnumType, value));
DescriptionAttribute dna =
(DescriptionAttribute)Attribute.GetCustomAttribute(
fi, typeof(DescriptionAttribute));
if (dna != null)
return dna.Description;
else
return value.ToString();
}
public override bool CanConvertFrom(ITypeDescriptorContext context, Type srcType)
{
return srcType == typeof(string);
}
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
foreach (FieldInfo fi in m_EnumType.GetFields())
{
DescriptionAttribute dna =
(DescriptionAttribute)Attribute.GetCustomAttribute(
fi, typeof(DescriptionAttribute));
if ((dna != null) && ((string)value == dna.Description))
return Enum.Parse(m_EnumType, fi.Name);
}
return Enum.Parse(m_EnumType, (string)value);
}
}
}