PropertyGrid控件由淺入深(二):基礎用法


目錄

  1. PropertyGrid控件由淺入深(一):文章大綱
  2. PropertyGrid控件由淺入深(二):基礎用法

控件的外觀構成

控件的外觀構成如下圖所示:

PropertyGrid控件包含以下幾個要素:

  • 屬性名稱
    屬性的名稱、標題。
  • 屬性編輯器(屬性值)
    這里顯示的是屬性的當前值,顯示的一般為文字,也可以以圖標的形式。編輯器會自動根據數據的類型定義一個驗證器,比如屬性類型為int類型,你是無法輸入字符內容的。另外,一般屬性的編輯是直接在屬性值這欄直接輸入,但是復雜的屬性,一般都會提供一個自定義的屬性編輯器以便更友好的輸入,比如顏色選擇。
  • 屬性說明(描述)
    屬性的詳細描述。
  • 可展開屬性
    對象屬性的展示,以便都是顯示對象屬性的名稱,以及對象屬性的值的.ToString()方法。除非,你設置這個屬性的特性Attribute為可展開屬性TypeConverter(typeof(ExpandableObjectConverter))。具體用法查看下一篇的“高級用法
  • 屬性分組
    屬性較多時,通過分組的形式,可以很容易的對屬性進行良好的組織。最常用的,就是我們在擴展一個控件的屬性時,可以給自定義出來的屬性打上一個分組標簽“xx公司自定義屬性”,這樣,別人在用你這個自定義控件的屬性時,就非常容易查看到哪些屬性是擴展上去的了。
  • 屬性的排序方式:按字母順序還是按分組排序
    可以選擇按字面順序排序、還是按分組排序來顯示所有的屬性,方便查找。在實際運用中,一般都是按分組顯示的。如果你對控件應用很熟悉了,已經知道有哪些屬性了,按字母排序,會加快你查找的速度。

控件的基本屬性

PropertyGrid控件繼承控件基類:Contorl,因此會包含Contorl的所有屬性,這里就不詳細的一一介紹了。

我們主要看看PropertyGrid特有的幾個屬性:

  • SelectedObject
    當前所綁定的對象
  • HelpVisible
    屬性描述區域是否顯示
  • HelpBackColor
    屬性描述區域的背景顏色
  • HelpForeColor
    屬性描述區域的前景顏色
  • CategoryForeColor
    屬性分組標題的前景顏色
  • ToolbarVisible
    工具欄是否可見
  • LargeButtons
    屬性可以顯示大工具欄按鈕

控件的基本事件

同樣,我們只關心其中最常用的事件:PropertyValueChanged。即當屬性變化時觸發的事件。

這個事件包括兩個參數:

  • object sender
    這里就是PropertyGrid控件

  • PropertyValueChangedEventArgs e
    我們查看下VS調試狀態這個值的屬性

    其中包含了兩個重要的屬性:OldValueChangeItem。而ChangeItem則是“PropertyDescriptorGridEntry”類型。

    一般可以通過ChangeItem的PropertyDescriptor的ComponentType查找到屬性的實際類型。

    而通過ChangeItem的Label,則可以查看到當前在屬性編輯輸入框中顯示的值。

    通過ChangeItem,基本可以處理所有的屬性變化的處理。

控件的對象綁定

控件的對象綁定非常非常簡單,只需一句話即可:propertyGrid1.SelectedObject = stu;

每次設置 SelectedObject 時,PropertyGrid 都會刷新顯示的屬性。這提供了一種簡單的方法來強制刷新屬性,或在運行時切換對象。您還可以調用 PropertyGrid.Refresh 方法來刷新屬性。

這里還有另外一個有意思的屬性:propertyGrid1.SelectedObjects = new object[] { stu, emp };。一般人可能不太理解這個的意思,而且在使用了這個綁定之后,有時竟然一個屬性都不出現了!

其實:propertyGrid1.SelectedObjects是用來顯示多個對象公用屬性的,參考MSDN的文檔:

The PropertyGrid only displays the properties that are common to all the objects that are in the array. Assigning an array to the SelectedObjects replaces the reference to any SelectedObject you might make.

比如我有如下兩個對象:

public class Employee
{
    public string Company { get; set; }
    public string Name { get; set; }
}
public class Student
{
    public string Name { get; set; }
    public SchoolType SchoolType { get; set; }
}

那么綁定這兩個對象到PropertyGrid控件會發生什么呢?

        var stu = new Student { Name = "Oracle", SchoolType = SchoolType.MiddleSchool };
        var emp = new Employee { Name = "Marvin", Company = "IBM" };

        propertyGrid1.SelectedObjects = new object[] { stu, emp };

我們看看最終的結果:

如何更改屬性的展示

在使用propertyGrid1.SelectedObject = stu;綁定屬性到對象之后,我們發現,屬性的名稱總是英文的名稱,描述也是不按我們的意思來,那么怎么修改呢?

PropertyGrid采用Attribute特性來控制屬性的顯示,除了屬性名稱、描述之后,還能控制屬性是否只讀、屬性是否顯示等等。具體可用的特性枚舉如下:

  • DescriptionAttribute - 設置顯示在屬性下方說明幫助窗格中的屬性文本。這是一種為活動屬性(即具有焦點的屬性)提供幫助文本的有效方法。

  • CategoryAttribute - 設置屬性在網格中所屬的類別。當您需要將屬性按類別名稱分組時,此特性非常有用。如果沒有為屬性指定類別,該屬性將被分配給雜項 類別。

  • BrowsableAttribute – 表示是否在網格中顯示屬性。此特性可用於在網格中隱藏屬性。默認情況下,公共屬性始終顯示在網格中。

  • ReadOnlyAttribute – 表示屬性是否為只讀。此特性可用於禁止在網格中編輯屬性。默認情況下,帶有 get 和 set 訪問函數的公共屬性在網格中是可以編輯的。

  • DefaultValueAttribute – 表示屬性的默認值。如果希望為屬性提供默認值,然后確定該屬性值是否與默認值相同,則可使用此特性。
    注意,此屬性僅用於序列化以及控件本身使用,並不實際對屬性進行默認值賦值。也就是,即使你設置了DefaultValue,在實際運行中,如果你沒有在構造函數或者其他任何地方賦值,則系統不會對該屬性賦值。如果你希望真正的給個默認值,則需要在構造函數中進行默認值的賦值。

    參考stackoverflow

    [DefaultValue] is only used by (for example) serialization APIs (like XmlSerializer), and some UI elements (like PropertyGrid). It doesn't set the value itself; you must use a constructor for that:
  • DefaultPropertyAttribute – 表示類的默認屬性。在網格中選擇某個類時,將首先突出顯示該類的默認屬性。

參考示例:

public class Student
{
    [Browsable(false)]
    public int Id { get; set; }

    [DisplayName("學生名稱"), Category("基礎設置"), Description("請填寫學生的名稱,不能為空"), ReadOnly(true)]
    public string Name { get; set; }

    [DefaultValue(SchoolType.University)]
    public SchoolType SchoolType { get; set; }
}

參考文章:

  1. .Net DefaultValueAttribute on Properties
  2. DefaultValue not working as expected when used with Custom Type Convertor
  3. C# PropertyGrid控件應用心得


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM