C#完成ProperTyGrid自界說屬性的辦法。本站提示廣大學習愛好者:(C#完成ProperTyGrid自界說屬性的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是C#完成ProperTyGrid自界說屬性的辦法正文
本文實例講授了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#法式設計有所贊助