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

艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_.Netpublic class ScopeConverter : TypeConverter
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_.Net_02艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_类型转换_03    
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_串行化_04{
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_ide_05        
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_控件_06艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_串行化_07        
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_串行化_04{
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_ide_05            
if (sourceType == typeof(String)) return true;
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_ide_05
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_ide_05            
return base.CanConvertFrom(context, sourceType);
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_控件_12        }

艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_ide_05
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_ide_05        
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_控件_06艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_串行化_07        
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_串行化_04{
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_ide_05            
if (destinationType == typeof(String)) return true;
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_ide_05
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_ide_05            
if (destinationType == typeof(InstanceDescriptor)) return true;
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_ide_05
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_ide_05            
return base.CanConvertTo(context, destinationType);
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_控件_12        }

艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_ide_05
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_ide_05        
public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.
CultureInfo culture, 
object value, Type destinationType)
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_控件_06艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_串行化_07        
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_串行化_04{
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_ide_05            String result 
= "";
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_ide_05            
if (destinationType == typeof(String))
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_控件_06艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_串行化_07            
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_串行化_04{
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_ide_05                Scope scope 
= (Scope)value;
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_ide_05                result 
= scope.Min.ToString()+"," + scope.Max.ToString();
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_ide_05                
return result;
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_ide_05
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_控件_12            }

艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_ide_05
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_ide_05            
if (destinationType == typeof(InstanceDescriptor))
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_控件_06艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_串行化_07            
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_串行化_04{
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_控件_06艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_串行化_07                ConstructorInfo ci 
= typeof(Scope).GetConstructor(new Type[] 艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_串行化_04{typeof(Int32),
typeof
(Int32) }
);
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_ide_05                Scope scope 
= (Scope)value;
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_控件_06艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_串行化_07                
return new InstanceDescriptor(ci, new object[] 艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_串行化_04{ scope.Min,scope.Max });
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_控件_12            }

艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_ide_05            
return base.ConvertTo(context, culture, value, destinationType);
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_控件_12        }

艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_ide_05
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_ide_05        
public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.
CultureInfo culture, 
object value)
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_控件_06艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_串行化_07        
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_串行化_04{
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_ide_05            
if (value is string)
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_控件_06艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_串行化_07            
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_串行化_04{
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_ide_05                String[] v 
= ((String)value).Split(',');
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_ide_05                
if (v.GetLength(0!= 2)
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_控件_06艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_串行化_07                
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_串行化_04{
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_ide_05                    
throw new ArgumentException("Invalid parameter format");
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_控件_12                }

艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_ide_05
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_ide_05                Scope csf 
= new Scope();
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_ide_05                csf.Min 
= Convert.ToInt32(v[0]);
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_ide_05                csf.Max 
= Convert.ToInt32(v[1]);
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_ide_05                
return csf;
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_控件_12            }

艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_ide_05            
return base.ConvertFrom(context, culture, value);
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_控件_12        }

艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_ide_05
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_ide_05        
public override bool GetPropertiesSupported(ITypeDescriptorContext context)
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_控件_06艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_串行化_07        
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_串行化_04{
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_ide_05            
return true;
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_控件_12        }

艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_ide_05
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_ide_05        
public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context,
object
 value, Attribute[] attributes)
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_控件_06艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_串行化_07        
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_串行化_04{
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_ide_05            
return TypeDescriptor.GetProperties(typeof(Scope), attributes);
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_控件_12        }

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

艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_.Net
      在GetProperties方法里,我用TypeDescriptor获得了Scope类的所有的属性描述器并返回。如果你对TypeDescriptor还不熟悉的话,可以参考MSDN
      重写这两个方法并编译以后,在测试工程里查看控件的属性,你可以看到Scope是如下的形式:
      艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能_串行化_94