自定义组件之属性(Property)的性质(Attribute)介绍(三)
点击次数:16 次 发布日期:2008-11-26 23:57:49 作者:源代码网
|
源代码网推荐 源代码网推荐展开的形式多用于一个属性为我们自定义类的类型,比如我们定义了一个类,该类中的一个属性是另一个我们定义的类。在这种情况下属性浏览器默认是没有办法来进行类型转换的,所以显示为不可编辑的内容。如果我们要以展开的形式编辑这个属性就需要我们向上面一样来重写属性转换器。 源代码网推荐 源代码网推荐我们首先定义一个自己的类来作为以后的属性类型。具体代码如下: 源代码网推荐 源代码网推荐public class ExpandProperty 源代码网推荐 源代码网推荐{ 源代码网推荐 源代码网推荐 private int _intList=0; 源代码网推荐 源代码网推荐 public int IntList 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 get { return this._intList;} 源代码网推荐 源代码网推荐 set { this._intList=value; } 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 private string _strList="Null"; 源代码网推荐 源代码网推荐 public string StrList 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 get { return this._strList;} 源代码网推荐 源代码网推荐 set { this._strList= value;} 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐} 源代码网推荐 源代码网推荐然后我们在自己的另一个类中声明一个这个类型的属性,在这里如果我们不加任何的性质限制,属性浏览器是不能转换改属性的。具体实现该属性的代码如下: 源代码网推荐 源代码网推荐 private ExpandProperty _dropList; 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 [CategoryAttribute("自定义的复杂类型设置(包括自定义类型转换器)"), 源代码网推荐 源代码网推荐 TypeConverterAttribute(typeof(PropertyGridApp.ExpandConverter)), 源代码网推荐 源代码网推荐 ReadOnlyAttribute(false)] 源代码网推荐 源代码网推荐 public ExpandProperty DropList 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 get { return this._dropList;} 源代码网推荐 源代码网推荐 set { this._dropList= value;} 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐为了让属性浏览器能够编辑该属性,也就是说能够把该属性转换成字符串,而且能够从字符串转换成该类的一个实例需要我们写如下的代码: 源代码网推荐 源代码网推荐/// <summary> 源代码网推荐 源代码网推荐/// 可以展开的类型转换器 源代码网推荐 源代码网推荐/// ExpandProperty 源代码网推荐 源代码网推荐/// </summary> 源代码网推荐 源代码网推荐public class ExpandConverter:System.ComponentModel.ExpandableObjectConverter 源代码网推荐 源代码网推荐{ 源代码网推荐 源代码网推荐 public ExpandConverter() 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 /// <summary> 源代码网推荐 源代码网推荐 /// 覆盖此方法已确定属性是否可以转换 源代码网推荐 源代码网推荐 /// </summary> 源代码网推荐 源代码网推荐 public override bool CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 if (destinationType==typeof(PropertyGridApp.ExpandProperty)) 源代码网推荐 源代码网推荐 return true; 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 return base.CanConvertTo(context,destinationType); 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 /// <summary> 源代码网推荐 源代码网推荐 /// 覆盖此方法并确保destinationType参数是一个String,然后格式化所显示的内容 源代码网推荐 源代码网推荐 /// </summary> 源代码网推荐 源代码网推荐 public override object ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 if (destinationType == typeof (System.String) && value is PropertyGridApp.ExpandProperty) 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 PropertyGridApp.ExpandProperty source=(PropertyGridApp.ExpandProperty)value; 源代码网推荐 源代码网推荐 return source.IntList+","+source.StrList; 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 return base.ConvertTo(context,culture,value,destinationType); 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 /// <summary> 源代码网推荐 源代码网推荐 /// 覆盖此方法已确定输入的字符串是可以被转化 源代码网推荐 源代码网推荐 /// </summary> 源代码网推荐 源代码网推荐 public override bool CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 if (sourceType==typeof(string)) 源代码网推荐 源代码网推荐 return true; 源代码网推荐 源代码网推荐 return base.CanConvertFrom(context,sourceType); 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 /// <summary> 源代码网推荐 源代码网推荐 /// 覆盖此方法根据 ConvertTo() 方法的转换格式来把所输入的字符串转换成类,并返回该类 源代码网推荐 源代码网推荐 /// </summary> 源代码网推荐 源代码网推荐 public override object ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 if (value is string) 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 string s=(string)value; 源代码网推荐 源代码网推荐 int comma=s.IndexOf(","); 源代码网推荐 源代码网推荐 if (comma!=-1) 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 try 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 string intList=s.Substring(0,comma); 源代码网推荐 源代码网推荐 string strList=s.Substring(comma+1,s.Length-comma-1); 源代码网推荐 源代码网推荐 PropertyGridApp.ExpandProperty Ep=new ExpandProperty(); 源代码网推荐 源代码网推荐 Ep.IntList=int.Parse(intList); 源代码网推荐 源代码网推荐 Ep.StrList=strList; 源代码网推荐 源代码网推荐 return Ep; 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 catch 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 return base.ConvertFrom(context,culture,value); 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 return base.ConvertFrom(context,culture,value); 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐} 源代码网推荐 源代码网推荐编译之后的画面如下: 源代码网推荐 源代码网推荐 源代码网供稿. |
