您的位置:首页 > 其它

WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能

2011-09-09 11:32 501 查看
前面的几篇文章中,我们给控件添加一个复杂的类型Scope,并且给它的类型提供的一个类型转换器,现在我们可以在属性浏览器中编辑它的值,并且它的值也被串行化的源代码里了。但是你有没有发现,在属性浏览器里编辑这个属性的值还是不太方便。因为属性只是“10,200”这种形式的,所以,你必须按照这种格式来修改,一旦格式错误就会引发异常,比如输入一个“10200”。我们期望这个属性的每一子属性都能够被独立的编辑就好了,这并非不能实现,而且实现还很简单。
   为了在属性浏览器里能够独立的编辑子属性,我们还要重写两个方法:GetPropertiesSupported()和GetProperties();下面是ScopeConverter的完整代码:

    public class ScopeConverter : TypeConverter

    {

        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)

        {

            if (sourceType == typeof(String)) return true;

            return base.CanConvertFrom(context, sourceType);

        }

        public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)

        {

            if (destinationType == typeof(String)) return true;

            if (destinationType == typeof(InstanceDescriptor)) return true;

            return base.CanConvertTo(context, destinationType);

        }

        public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)

        {

            String result = "";

            if (destinationType == typeof(String))

            {

                Scope scope = (Scope)value;

                result = scope.Min.ToString()+"," + scope.Max.ToString();

                return result;

            }

            if (destinationType == typeof(InstanceDescriptor))

            {

                ConstructorInfo ci = typeof(Scope).GetConstructor(new Type[] {typeof(Int32),typeof(Int32) });

                Scope scope = (Scope)value;

                return new InstanceDescriptor(ci, new object[] { scope.Min,scope.Max });

            }

            return base.ConvertTo(context, culture, value, destinationType);

        }

        public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)

        {

            if (value is string)

            {

                String[] v = ((String)value).Split(',');

                if (v.GetLength(0) != 2)

                {

                    throw new ArgumentException("Invalid parameter format");

                }

                Scope csf = new Scope();

                csf.Min = Convert.ToInt32(v[0]);

                csf.Max = Convert.ToInt32(v[1]);

                return csf;

            }

            return base.ConvertFrom(context, culture, value);

        }

        public override bool GetPropertiesSupported(ITypeDescriptorContext context)

        {

            return true;

        }

        public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes)

        {

            return TypeDescriptor.GetProperties(typeof(Scope), attributes);

        }

}在GetProperties方法里,我用TypeDescriptor获得了Scope类的所有的属性描述器并返回。如果你对TypeDescriptor还不熟悉的话,可以参考MSDN。   重写这两个方法并编译以后,在测试工程里查看控件的属性,你可以看到Scope是如下的形式:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐