zoukankan      html  css  js  c++  java
  • PropertyGrid使用总结4 IcustomTypeDescriptor

    前面章节说明了一个重要的类TypeConverter,有些对象需要提供自定义的描述的时候,TypeConverter可能就不满足,在那些情况下,需要实现自定义的描述呢, 比如以下需求:

    1. 当对象需要动态类型信息时,需要自描述的时候。
    2. COM 对象的类型信息,COM 对象不支持属性或属性,需要使用IcustomTypeDescriptor类封装。

    本章我们根据这两个需求,分别介绍当前接口的应用。

    为了实现对象可以当组件一样使用,我让类继承了Component类,代码如下:

    using System;
    
    using System.Collections.Generic;
    
    using System.ComponentModel;
    
    using System.Linq;
    
    using System.Text;
    
    using System.Threading.Tasks;
    
    using System.Windows.Forms;
    
     
    
    namespace AlbertControlExample.Controls
    
    {
    
    /// <summary>
    
    /// 定义一个组件
    
    /// </summary>
    
    public class CustomDef : Component, ICustomTypeDescriptor
    
    {
    
    public CustomDef()
    
    {
    
    Left = 0;
    
    Top = 0;
    
    }
    
    public CustomDef(int left, int top)
    
    {
    
    this.Left = left;
    
    this.Top = top;
    
    }
    
    public double Left { get; set; }
    
    public double Top { get; set; }
    
     
    
    /// <summary>
    
    /// 获取当前attributes集合
    
    /// </summary>
    
    /// <returns></returns>
    
    public AttributeCollection GetAttributes()
    
    {
    
    return TypeDescriptor.GetAttributes(this, true);
    
    }
    
     
    
    public string GetClassName()
    
    {
    
    return "类名称";
    
    }
    
     
    
    public string GetComponentName()
    
    {
    
    return "组件名称";
    
    }
    
     
    
    /// <summary>
    
    /// 当前对象的TypeConverter
    
    /// </summary>
    
    /// <returns></returns>
    
    public TypeConverter GetConverter()
    
    {
    
    return TypeDescriptor.GetConverter(this, true);
    
    }
    
    /// <summary>
    
    /// 返回当前的事件描述器
    
    /// </summary>
    
    /// <returns></returns>
    
    public EventDescriptor GetDefaultEvent()
    
    {
    
    return TypeDescriptor.GetDefaultEvent(this, true);
    
    }
    
     
    
    /// <summary>
    
    /// 返回当前的默认属性
    
    /// </summary>
    
    /// <returns></returns>
    
    public PropertyDescriptor GetDefaultProperty()
    
    {
    
    return TypeDescriptor.GetDefaultProperty(this, true);
    
    }
    
     
    
    /// <summary>
    
    /// 返回当前的编辑器
    
    /// </summary>
    
    /// <param name="editorBaseType"></param>
    
    /// <returns></returns>
    
    public object GetEditor(Type editorBaseType)
    
    {
    
    return TypeDescriptor.GetEditor(this, editorBaseType, true);
    
    }
    
     
    
    /// <summary>
    
    /// 返回当前的事件集合
    
    /// </summary>
    
    /// <returns></returns>
    
    public EventDescriptorCollection GetEvents()
    
    {
    
    return TypeDescriptor.GetEvents(this, true);
    
    }
    
     
    
    /// <summary>
    
    /// 返回当前的事件描述集合
    
    /// </summary>
    
    /// <param name="attributes"></param>
    
    /// <returns></returns>
    
    public EventDescriptorCollection GetEvents(Attribute[] attributes)
    
    {
    
    return TypeDescriptor.GetEvents(this, attributes, true);
    
    }
    
     
    
    /// <summary>
    
    /// 返回当前的属性集合
    
    /// </summary>
    
    /// <returns></returns>
    
    public PropertyDescriptorCollection GetProperties()
    
    {
    
    PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(this, true);
    
     
    
    return properties;
    
    }
    
     
    
    /// <summary>
    
    /// 返回当前的属性描述集合
    
    /// </summary>
    
    /// <param name="attributes"></param>
    
    /// <returns></returns>
    
    public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
    
    {
    
    PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(this, attributes, true);
    
    return properties;
    
    }
    
    
    /// <summary>
    
    /// 返回当前属性的宿主
    
    /// </summary>
    
    /// <param name="pd"></param>
    
    /// <returns></returns>
    
    public object GetPropertyOwner(PropertyDescriptor pd)
    
    {
    
    return this;
    
    }
    
    }
    
    }

    我们分别说明每个函数的作用和意义。

    1、显示一些名称

    public string GetClassName()
    
    {
    
    return "类名称";
    
    }
    
     
    
    public string GetComponentName()
    
    {
    
    return "组件名称";
    
    }

    这两个主要用于显示的目的,如图

    2、默认属性的默认事件

    /// <summary>
    
    /// 返回当前的默认事件
    
    /// </summary>
    
    /// <returns></returns>
    
    public EventDescriptor GetDefaultEvent()
    
    {
    
    return TypeDescriptor.GetDefaultEvent(this, true);
    
    }
    
     
    
    /// <summary>
    
    /// 返回当前的默认属性
    
    /// </summary>
    
    /// <returns></returns>
    
    public PropertyDescriptor GetDefaultProperty()
    
    {
    
    PropertyDescriptor propertyDescriptor = TypeDescriptor.CreateProperty(typeof(CustomDef),"Left",typeof(double));
    
    return propertyDescriptor;
    
    }

    这两个函数很特殊,其实就是显示默认的属性和双击控件默认的生成事件,如下图,优先显示的属性

    3、当前的属性集合和事件集合

    /// <summary>
    
    /// 返回当前的事件集合
    
    /// </summary>
    
    /// <returns></returns>
    
    public EventDescriptorCollection GetEvents()
    
    {
    
    return TypeDescriptor.GetEvents(this, true);
    
    }
    
     
    
    /// <summary>
    
    /// 返回当前的事件描述集合
    
    /// </summary>
    
    /// <param name="attributes"></param>
    
    /// <returns></returns>
    
    public EventDescriptorCollection GetEvents(Attribute[] attributes)
    
    {
    
    return TypeDescriptor.GetEvents(this, attributes, true);
    
    }
    
     
    
    /// <summary>
    
    /// 返回当前的属性集合
    
    /// </summary>
    
    /// <returns></returns>
    
    public PropertyDescriptorCollection GetProperties()
    
    {
    
    PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(this, true);
    
     
    
    return properties;
    
    }
    
     
    
    /// <summary>
    
    /// 返回当前的属性描述集合
    
    /// </summary>
    
    /// <param name="attributes"></param>
    
    /// <returns></returns>
    
    public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
    
    {
    
    PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(this, attributes, true);
    
     
    
    return properties;
    
    }
    
     

    4、编辑器对象

    用于获取当前的对象的属性列表和事件列表,也就是我们所有显示的列表对象

    /// <summary>
    
    /// 返回当前的编辑器
    
    /// </summary>
    
    /// <param name="editorBaseType"></param>
    
    /// <returns></returns>
    
    public object GetEditor(Type editorBaseType)
    
    {
    
    return TypeDescriptor.GetEditor(this, editorBaseType, true);
    
    }

    用于获取当前的类型编辑器,这个在下一章会详细介绍。

    其他函数,比较简单,很容易理解。

  • 相关阅读:
    leetcode——36.有效的数独
    leetcode——60.第K个排列
    leetcode——128. 最长连续序列
    leetcode——81. 搜索旋转排序数组 II
    leetcode——49.字母异构词分组
    leetcode——75.颜色分类
    leetcode——44.通配符匹配
    leetcode——88.合并两个有序数组
    leetcode——116.填充每一个节点的下一个右侧节点指针
    树莓派系统终端中让文件和文件夹显示不同颜色的设置
  • 原文地址:https://www.cnblogs.com/minhost/p/12300751.html
Copyright © 2011-2022 走看看