zoukankan      html  css  js  c++  java
  • 艾伟:WinForm控件开发总结(七)为复杂属性的子属性提供编辑功能 狼人:

          前面的几篇文章中,我们给控件添加一个复杂的类型Scope,并且给它的类型提供的一个类型转换器,现在我们可以在属性浏览器中编辑它的值,并且它的值也被串行化的源代码里了。但是你有没有发现,在属性浏览器里编辑这个属性的值还是不太方便。因为属性只是“10200这种形式的,所以,你必须按照这种格式来修改,一旦格式错误就会引发异常,比如输入一个“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是如下的形式:
          
          

  • 相关阅读:
    linux查看端口被占用等常用命令
    python批量修改文件内容及文件编码方式的处理
    为什么在Python里推荐使用多进程而不是多线程
    python小练习之读取文件写入excel
    python 小练习之生成手机号码
    python 小练习之删除文件夹下的所有文件,包括子文件夹中的文件
    python中 字符 字典 列表之间的转换
    统计表中 重复出现 XX次以上的数据
    java数据类型
    字符编码和python使用encode,decode转换utf-8, gbk, gb2312
  • 原文地址:https://www.cnblogs.com/waw/p/2156848.html
Copyright © 2011-2022 走看看