首页 > 编程 > C# > 正文

C#实现ProperTyGrid自定义属性的方法

2020-01-24 02:26:18
字体:
来源:转载
供稿:网友

本文实例讲解了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;    }}

前台调用如下图所示:

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#程序设计有所帮助

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表