实例详解Scope属性在C#中的应用

Scope属性在C#中的应用有很多,这里向你介绍Scope属性实现C#控件开发中复杂属性的子属性的编辑功能,希望通过实例使你加深对Scope属性的认识。

Scope属性在C#中的应用的思路:

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

为了在属性浏览器里能够独立的编辑子属性,我们还要重写两个方法:GetPropertiesSupported()和GetProperties();下面是ScopeConverter的完整代码:

Scope属性在C#中的应用实例代码:

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;  




///Scope属性在C#中的应用  



}  


 



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;  



}  



///Scope属性在C#中的应用  




public override PropertyDescriptorCollection   



GetProperties(ITypeDescriptorContext context,   



object value, Attribute[] attributes)  



{  



return TypeDescriptor.GetProperties(  




typeof(Scope), attributes);  



}  


}  

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

相关推荐