C#PropertyGrid下拉选择数据报错

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

99乘法口诀万物皆可变

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值