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;
       }
   }

前台調用


QQ截圖20140904111616

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);
        }

效果圖

QQ截圖20140904112009


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM