本文实例讲解了C#实现ProperTyGrid自定义属性的方法,分享给大家供大家参考。具体方法如下:
一般来说,C#如果要实现自定义属性必须要需要实现接口ICustomTypeDescriptor,具体实现方法如下:
// 摘要: // 提供为对象提供动态自定义类型信息的接口。 public interface ICustomTypeDescriptor
示例如下:
////// 自定义属性对象 /// 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()); } } ////// 自定义性质描述类 /// 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; } ////// 是否应该持久化保存 /// /// ///public override bool ShouldSerializevalue(object component) { return false; } /// /// 属性说明 /// public override string Description { get { return myattr.Description; } } } ////// 实现自定义的特殊属性对象必须继承ICustomTypeDescriptor,并实现Dictionary /// public class MyAttrCollection : Dictionary, ICustomTypeDescriptor { /// /// 重写Add方法 /// /// 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#程序设计有所帮助



