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 中测试下拉框选择,确保选择的值能够正确转换为属性的类型。