1、问题点--PropertyGrid下拉框报错
PropertyGrid:属性窗口:滚轮选择或者手动输入不报错,下拉框选择报错 属性值无效:类型“System:String”的对象无法转化为类型“System:Int32”
PropertyGrid:属性窗口:滚轮选择或者手动输入不报错,下拉框选择报错 属性值无效:类型“System:String”的对象无法转化为类型“System:Boolean”
2、原有问题代码代码
public class IntValueConverter : TypeConverter{public override bool GetStandardValuesSupported(ITypeDescriptorContext context){return true; // 支持标准值}public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context){return new StandardValuesCollection(new[] { -1, 0, 1, 2 });}public override bool GetStandardValuesExclusive(ITypeDescriptorContext context){return true; // 只允许选择标准值}public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value){if (value is string strValue && int.TryParse(strValue, out int intValue)){return intValue;}return base.ConvertFrom(context, culture, value);}}
public class BoolValueConverter : TypeConverter{public override bool GetStandardValuesSupported(ITypeDescriptorContext context){return true; // 支持标准值}public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context){return new StandardValuesCollection(new[] { true, false }); // 返回字符串选项}public override bool GetStandardValuesExclusive(ITypeDescriptorContext context){return true; // 只允许选择标准值}public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value){if (value is string strValue){// 尝试将字符串转换为布尔值if (bool.TryParse(strValue, out bool boolValue)){return boolValue;}}return base.ConvertFrom(context, culture, value);}}
3、解决问题代码
public class IntValueConverter : TypeConverter{public override bool GetStandardValuesSupported(ITypeDescriptorContext context){return true; // 支持标准值}public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context){return new StandardValuesCollection(new[] { "-1", "0", "1", "2" });}public override bool GetStandardValuesExclusive(ITypeDescriptorContext context){return true; // 只允许选择标准值}public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value){if (value is string strValue){if (int.TryParse(strValue, out int intValue)){return intValue; // 转换为整数}}return base.ConvertFrom(context, culture, value);}}
public class BoolValueConverter : TypeConverter{public override bool GetStandardValuesSupported(ITypeDescriptorContext context){return true; // 支持标准值}public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context){return new StandardValuesCollection(new[] { "true", "false" }); // 返回字符串选项}public override bool GetStandardValuesExclusive(ITypeDescriptorContext context){return true; // 只允许选择标准值}public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value){if (value is string strValue){return bool.TryParse(strValue, out bool boolValue) ? boolValue : base.ConvertFrom(context, culture, value);}return base.ConvertFrom(context, culture, value);}}
4、解决问题思路
在处理 PropertyGrid 中的下拉框选择时,确保类型转换器能够正确处理从下拉框返回的字符串值是关键。以下是解决问题的思路:
理解类型转换:
PropertyGrid 在显示下拉框时,会将选项作为字符串返回。因此,转换器需要能够处理字符串并将其转换为目标类型(如 int 或 bool)。
修改 GetStandardValues 方法:
在 IntValueConverter 中,返回的标准值应为字符串类型(例如 "-1", "0", "1", "2"),以便与下拉框的返回值匹配。
实现 ConvertFrom 方法:
在 ConvertFrom 方法中,确保能够将字符串转换为目标类型。对于整数,使用 int.TryParse;对于布尔值,使用 bool.TryParse。
确保一致性:
确保在整个代码中,属性的类型与转换器返回的类型一致。例如,如果属性是 int 类型,转换器应该返回字符串表示的整数,并在 ConvertFrom 中进行转换。
测试:
在 PropertyGrid 中测试下拉框选择,确保选择的值能够正确转换为属性的类型。