C#實現ProperTyGrid自訂屬性的方法

來源:互聯網
上載者:User

標籤:格式化   ffffff   tor   attrs   匯入   pointer   ++   定義類   代碼   

本文執行個體講解了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#程式設計有所協助

除聲明外, 跑步客文章均為原創,轉載請以連結形式標明本文地址
  C#實現ProperTyGrid自訂屬性的方法

本文地址:  http://www.paobuke.com/develop/c-develop/pbk23538.html






相關內容深入理解C# DateTime日期格式化C#在Unity遊戲開發中進行多線程編程的方法C#執行個體代碼之抽獎升級版可以經表格式資料匯入資料庫,抽獎設定,補抽C#實作類別似jQuery的方法連綴功能
詳解C#讀取Appconfig中自訂的節點C#實現頁面GZip或Deflate壓縮的方法淺談C#設計模式之原廠模式C#基於NPOI產生具有精確列寬行高的Excel檔案的方法

C#實現ProperTyGrid自訂屬性的方法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.