知识大全 编写与.NET属性窗口交互的RAD组件(二)

Posted 属性

篇首语:记忆的坐标有多么清晰,前进的脚步就有多么坚定。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 编写与.NET属性窗口交互的RAD组件(二)相关的知识,希望对你有一定的参考价值。

编写与.NET属性窗口交互的RAD组件(二)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

   扩展属性和字符串转换 TypeConverter和属性窗口     NET属性窗口最重要的一个特性就是可以显示嵌套的属性 这样就提供了比属性类别更加细化和更有逻辑的分类 嵌套属性对于类目显示和排序显示都是适用的 这样可以让属性列表更加紧凑 比如我们用带有子属性X和Y的一个Location属性来代替Top和Left两个属性就更加合理      图 嵌套属性    不过 如何来决定一个属性可以展开呢?这些不是由属性窗口来决定 而是取决于属性自己的类型 在 NET framework中 每一种类型都是和一个TypeConverter联系在一起的 比如Boolean和string的TypeConverter就不会允许展开 因为让boolean类型含有子属性是没有意义的     在 NET framework中 TypeConverter实际上是执行了不少的方法 在属性窗口中就更多了 正像他的名字所说明的那样 TypeConverter提供了一种动态的从一种类型改变到另一种类型的标准方式 事实上 属性窗口只和string打交道 所以他就依赖于TypeConverter来进行类型之间的转换(主要是和string类型的转换) TypeConverter同样是可以提供扩展性能以及复杂类型来和属性窗口交互     比如 看下面这个Person类     [TypeConverter(typeof(PersonConverter))]    public class Person        private string firstName = ;    private string lastName = ;    private intage = ;        public int Age        get        return age;        set        age = value;          public string FirstName        get        return firstName;        set        this firstName = value;            public string LastName        get        return lastName;        set        this lastName = value;                我们注意到Person类被指定了TypeConverterAttribute特性 TypeConverterAttribute特性还指定了这个类的类型转换器(PersonConverter) 如果没有指定TypeConverterAttribute特性 默认使用TypeConverter类 对于一些简单数据类型 比如Font Point等 TypeConverter可以很好地工作 但如果数据类型比较复杂 那么它对类型是转换可能就不是我们希望的那样 因此 我们有必要从TypeConverter派生自己的类型转换器 在这里就是PersonConverter 本例中 我们首先重载了GetPropertiesSupported和GetProperties方法来决定属性是否可以展开     internal class PersonConverter : TypeConverter        public override PropertyDescriptorCollection    GetProperties(ITypeDescriptorContext context     object value     Attribute[] filter)        return TypeDescriptor GetProperties(value filter);        public override bool GetPropertiesSupported(    ITypeDescriptorContext context)        return true;            在通常情况下 直接使用TpyeConverter进行转换已经足够了 简单的扩展就是从TypeConverter直接派生你所要的类型转换器 更复杂的扩展就需要从ExpandableObjectConverter派生类型转换器了 现在我们修改PersonConverter来转换一个Person类并且显示一个字符串     internal class PersonConverter : ExpandableObjectConverter        public override bool CanConvertFrom(    ITypeDescriptorContext context Type t)        if (t == typeof(string))        return true;        return base CanConvertFrom(context t);        public override object ConvertFrom(    ITypeDescriptorContext context     CultureInfo info     object value)        if (value is string)        try        string s = (string) value;    // parse the format Last First (Age)     //    int ma = s IndexOf( );    if (ma != )        // now that we have the ma get    // the last name     string last = s Substring( ma);    int paren = s LastIndexOf( ( );    if (paren != && s LastIndexOf( ) ) == s Length )        // pick up the first name    string first = s Substring(ma + paren ma );    // get the age    int age = Int Parse(    s Substring(paren +     s Length paren ));    Person p = new Person();    p Age = age;    p LastName = last Trim();    p FirstName = first Trim();    return p;                catch     // if we got this far plain that we    // couldn t parse the string    //    throw new ArgumentException(     Can not convert + (string)value +     to type Person );        return base ConvertFrom(context info value);        public override object ConvertTo(    ITypeDescriptorContext context     CultureInfo culture     object value     Type destType)        if (destType == typeof(string) && value is Person)        Person p = (Person)value;    // simply build the string as Last First (Age)     return p LastName + +    p FirstName +  ( + p Age ToString() + ) ;        return base ConvertTo(context culture value destType);            现在看看我们的Person属性在指定了PersonConverter类型转换器之后 既可以展开 又可以通过两种方式来操作了 直接修改和使用子属性     图 实现展开的TypeConverter    要使用上面的代码 我们就生成一个UserControl并且写下如下的代码     private Person p = new Person();    public Person Person        get        return p;        set        this p = value;         cha138/Article/program/net/201311/12805

相关参考

知识大全 编写与.NET属性窗口交互的RAD组件(四)

编写与.NET属性窗口交互的RAD组件(四)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  提供

知识大全 ASP.NET入门教程 1.7.8 属性窗口[2]

ASP.NET入门教程1.7.8属性窗口[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nb

知识大全 ASP.NET入门教程 1.7.8 属性窗口[1]

ASP.NET入门教程1.7.8属性窗口[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nb

知识大全 子窗口和父窗口交互

JavaScript实际应用:子窗口和父窗口交互  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 .net程序员的盲点(二):两个属性引起的歧义

  两个属性引起的歧异property和attribute的区别这虽然没有一个馒头引发的血案那么严重但是也足以成为net程序员的技术盲点之二  对于property和attribute这两个名词都叫属

知识大全 自己动手编写组件

ASP讲座之十:自己动手编写组件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一组件编写速成—

知识大全 RAD Studio 2009通过Mono提供.NET应用跨平台开发

RADStudio2009通过Mono提供.NET应用跨平台开发  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起

知识大全 asp.net中的validaterequest属性与安全性

  不知道大家之前有没有注意到这个属性这里我们来一起讨论一下这个属性的作用以及我们以后到底该怎样使用它!  我们先来了解一下这个属性:(注:本属性中是新增的!)  它所在的命名空间:SystemWeb

知识大全 按键事件

  KeyDown(按键)用于响应键盘中首次按下的键  KeyDown事件同样可以在如图所示的Form属性窗口中找到双击该项为其编写事件响应如下  privatevoidForm_KeyDown(ob

知识大全 鼠标悬停事件

  MouseHover(鼠标悬停)事件发生于鼠标悬停在窗体控件上一段时间之后  同样在如图所示的Form属性窗口找到MouseHover事件项双击该项进入该事件代码编辑文件Formcs并对其编写事件