C# ProperTyGrid 自定义属性

C# 如果要实现自定义属性必须要需要实现接口ICustomTypeDescriptor

  // 摘要:
  //     提供为对象提供动态自定义类型信息的接口。
  public interface ICustomTypeDescriptor

例子:

/// <summary>
    /// 自定义属性对象
    /// </summary>
    public class MyAttr
    {
        private string name = string.Empty;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        private object value = null;

        public object Value
        {
            get { return this.value; }
            set { this.value = value; }
        }

        private string description = string.Empty;

        public string Description
        {
            get { return description; }
            set { description = value; }
        }


        public override string ToString()
        {
            return string.Format("Name:{0},Value:{1}",name.ToString(),value.ToString());
        }
    }

 /// <summary>
    /// 自定义性质描述类
    /// </summary>
    public class MyPropertyDescription : PropertyDescriptor
   {
        private MyAttr myattr = null;
        public MyPropertyDescription(MyAttr myattr, Attribute[] attrs): base(myattr.Name, attrs) 
        {
            this.myattr = myattr;
        }
       public override bool CanResetValue(object component)
       {
           return false;
       }

       public override Type ComponentType
       {
           get
           {
               return this.GetType();
           }
       }

       public override object GetValue(object component)
       {
           return myattr.Value;
       }

       public override bool IsReadOnly
       {
           get 
           {
               return false;
           }
       }

       public override Type PropertyType
       {
           get 
           {
               return myattr.Value.GetType();
           }
       }

       public override void ResetValue(object component)
       {
            //不重置,无动作 
       }

       public override void SetValue(object component, object value)
       {
           myattr.Value = value;
       }
       /// <summary>
       /// 是否应该持久化保存
       /// </summary>
       /// <param name="component"></param>
       /// <returns></returns>
       public override bool ShouldSerializeValue(object component)
       {
           return false;
       }
       /// <summary>
       /// 属性说明
       /// </summary>
       public override string Description
       {
           get
           {
               return myattr.Description;
           }
       }
   }

  /// <summary>
    /// 实现自定义的特殊属性对象必须继承ICustomTypeDescriptor,并实现Dictionary
   /// </summary>
    public class MyAttrCollection : Dictionary<String, MyAttr>, ICustomTypeDescriptor
   {
       /// <summary>
       /// 重写Add方法
       /// </summary>
       /// <param name="attr"></param>
       public void Add(MyAttr attr) 
       {
           if (!this.ContainsKey(attr.Name))
           {
               base.Add(attr.Name, attr);
           }
       }

       public AttributeCollection GetAttributes()
       {
           return TypeDescriptor.GetAttributes(this, true);
       }

       public string GetClassName()
       {
           return TypeDescriptor.GetClassName(this,true);
       }

       public string GetComponentName()
       {
           return TypeDescriptor.GetClassName(this, true);
       }

       public TypeConverter GetConverter()
       {
           return TypeDescriptor.GetConverter(this, true);
       }

       public EventDescriptor GetDefaultEvent()
       {
           return TypeDescriptor.GetDefaultEvent(this, true);
       }

       public PropertyDescriptor GetDefaultProperty()
       {
           return TypeDescriptor.GetDefaultProperty(this, true);
       }

       public object GetEditor(Type editorBaseType)
       {
           return TypeDescriptor.GetEditor(this, editorBaseType, true);
       }

       public EventDescriptorCollection GetEvents(Attribute[] attributes)
       {
           return TypeDescriptor.GetEvents(this, attributes, true);
       }

       public EventDescriptorCollection GetEvents()
       {
           return TypeDescriptor.GetEvents(this, true);
       }

       public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
       {
           int count=this.Values.Count;
           PropertyDescriptor[] pds=new PropertyDescriptor[count];
           int index = 0;
           foreach (MyAttr item in this.Values)
           {
               pds[index] = new MyPropertyDescription(item,attributes);
               index++;
           }
           return new PropertyDescriptorCollection(pds);
       }

       public PropertyDescriptorCollection GetProperties()
       {
           return TypeDescriptor.GetProperties(this,true);
       }

       public object GetPropertyOwner(PropertyDescriptor pd)
       {
           return this;
       }
   }

前台调用


C# ProperTyGrid 自定义属性_第1张图片

private void btnAddProperType_Click(object sender, EventArgs e)
        {
            MyAttr attr = new MyAttr();
            attr.Name = txtName.Text.Trim();
            attr.Value = txtValue.Text.Trim();
            attr.Description = txtDescription.Text.Trim();
            mac.Add(attr);
            MyGrid.Refresh();
        }

 

private void button1_Click(object sender, EventArgs e)
        {
            AddAttrColor();
            AddAttrImage();
            AddAttrEmun();
            MyGrid.Refresh();
        }

        private void AddAttrEmun()
        {
            MyAttr attr = new MyAttr();
            attr.Name = "Dock";
            attr.Value = DockStyle.Fill;
            attr.Description = "枚举";
            mac.Add(attr);
        }

        private void AddAttrImage()
        {
            MyAttr attr = new MyAttr();
            attr.Name = "Image";
            attr.Value = new Bitmap(400,300);
            attr.Description = "图片";
            mac.Add(attr);
        }

        private void AddAttrColor()
        {
            MyAttr attr = new MyAttr();
            attr.Name = "Color";
            attr.Value = Color.Red;
            attr.Description = "颜色";
            mac.Add(attr);
        }

效果图

C# ProperTyGrid 自定义属性_第2张图片

你可能感兴趣的:(property)