本文实例讲解了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#程序设计有所帮助