国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
運(yùn)行時(shí)自定義PropertyGrid顯示屬性項(xiàng)目 - 積累與沉淀的跌代 - 博客園

運(yùn)行時(shí)自定義PropertyGrid顯示屬性項(xiàng)目

運(yùn)行時(shí)自定義PropertyGrid顯示屬性項(xiàng)目

簡述

PropertyGrid所顯示的屬性內(nèi)容包括屬性分類(Category)及組件屬性,

在一般情況下直接使用PropertyGrid來顯示一個(gè)對(duì)象的所有屬性是非常方便的,只需一個(gè)語句就能完成:

propertyGrid.SelectedObject = component;

但在實(shí)際應(yīng)用中可能會(huì)不需要顯示所有屬性項(xiàng)目,而是通過外部指定(通過XML等進(jìn)行描述),這些設(shè)置一般情況下在創(chuàng)建組件時(shí)用代碼中的Attribute來進(jìn)行具體設(shè)置,如所屬分類,顯示標(biāo)題等,這只能針對(duì)于一些自建的組件可以這么做。

問題描述

像上面所說,在創(chuàng)建自建組件時(shí)可以用Attribute的方式來設(shè)置PropertyGrid的顯示樣式,但這種方法不能應(yīng)用于已有的組件,像系統(tǒng)中的TextBox,Button等,除非自己建立一個(gè)由這些組件派生的類,當(dāng)然這樣做會(huì)加大復(fù)雜度。像要實(shí)現(xiàn)下面所顯示的這種效果在實(shí)際操作時(shí)會(huì)很麻煩。

左圖是TextBox原有的所有屬性,右圖是經(jīng)過處理后的屬性

 

解決方法

.Net中提供了一個(gè)自定義類型說明的接口(System.ComponentModel.ICustomTypeDescriptor),PropertyGrid可以直接自動(dòng)處理用此接口生成的對(duì)象,因此在處理這個(gè)問題的時(shí)候只需要?jiǎng)?chuàng)建一個(gè)基于這個(gè)接口的處理類就可以達(dá)到世期望的目標(biāo),在這個(gè)接口中提供了GetProperties方法用于返回所選組件的所有屬性,因此我們可以通過這個(gè)方法可以對(duì)我們所需要的屬性進(jìn)行過濾,下面是一段GetPropertys的處理代碼:

    public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
    {
      List<CustomPropertyDescriptor> tmpPDCLst = new List<CustomPropertyDescriptor>();
      PropertyDescriptorCollection tmpPDC = TypeDescriptor.GetProperties(mCurrentSelectObject, attributes);
      IEnumerator tmpIe = tmpPDC.GetEnumerator();
      CustomPropertyDescriptor tmpCPD;
      PropertyDescriptor tmpPD;
      while (tmpIe.MoveNext())
      {
        tmpPD = tmpIe.Current as PropertyDescriptor;
        if (mObjectAttribs.ContainsKey(tmpPD.Name))
        {
          tmpCPD = new CustomPropertyDescriptor(mCurrentSelectObject, tmpPD);
          tmpCPD.SetDisplayName(mObjectAttribs[tmpPD.Name]);
          //此處用于處理屬性分類的名稱,可以在XML等設(shè)置文件中進(jìn)行設(shè)置,在這段代碼中只是簡單的在分類后加了中文兩個(gè)字
          tmpCPD.SetCategory(tmpPD.Category + "中文");  
          tmpPDCLst.Add(tmpCPD);
        }
      }
      return new PropertyDescriptorCollection(tmpPDCLst.ToArray());
    }

當(dāng)然在進(jìn)行屬性過慮之后,
PropertyGrid中所顯示的屬性名稱都還是原有名稱,若想同時(shí)改變?cè)?/span>PropertyGrid中顯示出來的名稱則需要重寫PropertyDescriptor中的部分方法,在上面這段代碼中的CustomPropertyDescriptor就是一個(gè)基于PropertyDescriptor的類。

CustomPropertyDescriptor類中最主要的是重寫DisplayNameCategory這兩個(gè)屬性,但由于在PropertyDescriptor中這兩個(gè)屬性是只讀的,因此在這個(gè)類中需要加入兩個(gè)用于設(shè)置這兩個(gè)屬性的方法(或直接用Field)在這里我使用了SetDispalyNameSetCategory這兩個(gè)方法:

     
private string mCategory;
 
      public override string Category 
      { 
        get { return mCategory; } 
      } 
      private string mDisplayName ; 
      public override string DisplayName 
      { 
        get { return mDisplayName; } 
      } 
      public void SetDisplayName(string pDispalyName) 
      { 
        mDisplayName = pDispalyName; 
      } 
      public void SetCategory(string pCategory) 
      { 
        mCategory = pCategory; 
      } 
  就這樣的幾步,便可以將PropertyGrid中顯示的內(nèi)容完全自定義。

在寫ICustomTypeDescriptor接口時(shí),其他的一些方法可以用TypeDescriptor直接返回相關(guān)方法調(diào)用,并在GetPropertyOwner方法中應(yīng)返回當(dāng)前選擇對(duì)象否則將不會(huì)對(duì)修改值起任何作用

   public object GetPropertyOwner(PropertyDescriptor pd) 
    {
       return mCurrentSelectObject; 
    }

  在寫CustomPropertyDescriptor類時(shí)需要一個(gè)PropertyDescriptor對(duì)象,在實(shí)現(xiàn)一些方法時(shí)直接返回這個(gè)對(duì)象的值。

  當(dāng)然也可以通過這個(gè)方法來自定義一些Events的輸出,

使用方法 

      //加載組件屬性,從XML文件載入,此處為Button
     
XmlNode tmpXNode = mXDoc.SelectSingleNode("Components/Component[@Name=\"Button\"]");
      //選擇屬性設(shè)置
      XmlNodeList tmpXPropLst = tmpXNode.SelectNodes("Propertys/Property");
      //創(chuàng)建CustomProperty對(duì)象
      CustomProperty cp = new CustomProperty(sender, tmpXPropLst);
      //設(shè)置PropertyGrid選擇對(duì)象
      propertyGrid1.SelectedObject = cp;

文件下載
 

源碼
演示
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
PropertyGrid控件擴(kuò)展--自定義顯示屬性內(nèi)容、屬性名稱及分類
動(dòng)態(tài)可訂制屬性的 PropertyGrid
PropertyGrid自定義屬性的實(shí)現(xiàn)
C#中Property Grid(屬性面板)控件的使用
學(xué)習(xí)Spring必學(xué)的Java基礎(chǔ)知識(shí)(3)
vue從入門到學(xué)會(huì)第七天--------組件中
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服