Windows Form的PropertyGrid控制項

摘要:Windows Form的PropertyGrid控制項

一般在使用Visual Studio 2008開發工具的時候,常常都會用到屬性視窗,不過屬性視窗的元件其實在Windows Form也有提供,可以在工具箱找到,叫作PropertyGrid

 
 
其實使用方法相當簡單,只要將他拖拉到Form上面就會呈現一個空的PropertyGrid物件,並將屬性Dock設定成 Fill的值,就會變成下面的樣子
 
 
接著就是要建立PropertyGrid裡面的欄位資料,所以在這邊我們先定義一個簡單的類別,這是用來設定所有的欄位:
public class PropertyGridField 
{ 
  public string Column_A { get; set; }
  public string Column_B { get; set; } 

  [Browsable(false)]
  public string Column_C { get; set; } 
} 
這邊有用到Browsable的屬性(Attribute),可以透過此屬性來設定是否要將Column_C顯示到 PropertyGrid,不過在顯示之前,我們要將PropertyGridField的類別綁繫到PropertyGrid控制項上,所以可以透過PropertyGrid的SelectedObject屬性來設定,如下在Form1的建構子裡面加入下面的程式碼:
propertyGrid1.SelectedObject = new PropertyGridField(); 
這時候就可以執行看到綁繫後的PropertyGrid,並且只有顯示Column_A和Column_B
 
 
當然我們可能會常常看到PropertyGrid可以有按鈕顯示或是下拉選單,這時候就要透過Editor的Attrubute來定義,例如在Column_A的屬性上面定義Editor,如下面的程式碼:
[Editor(typeof(ImageEditor), typeof(UITypeEditor))]
public string Column_A { get; set; }
在Editor的Attrubute裡面傳入了兩個參數,第一個就是要在Column_A欄位顯示的設計視窗,例如在這邊是使用.NET內建的System.Drawing.Design.ImageEditor,可以用來開窗選擇圖片;第二個欄位是用來當作索引鍵,但是必須是第一個參數的父類別,通常會使用System.Drawing.Design.UITypeEditor來表示。所以畫面就會向下面一樣:
 
 
 
 
點選「...」的按鈕後就會出現一個檔案選擇的視窗,當然我也可以自訂自己的開窗方式,不過類別必須要實作UITypeEditor,在此類別內提供了幾個方法
 
  • EditValue方法:取得自訂視窗所選擇的值。
  • GetEditStyle方法:通知編輯樣式要顯示的選擇方式,例如提供按鈕或是下拉選單。
  • GetPaintValueSupported方法:指出編輯器支援顯示數值的表示。
  • PaintValue方法:用來呈現屬性值的外觀樣式。
上面的方法需要透過覆寫的方式來自訂成我們所需的,就來看個簡單範例:
public class TestPopPropertyEditor : UITypeEditor
{
    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext pContext)
    {
        if (pContext != null && pContext.Instance != null)
        {
            //以「...」按鈕的方式顯示
            //UITypeEditorEditStyle.DropDown    下拉選單
            //UITypeEditorEditStyle.None        預設的輸入欄位
            return UITypeEditorEditStyle.Modal;
        }
        return base.GetEditStyle(pContext);
    }

    public override object EditValue(ITypeDescriptorContext pContext, IServiceProvider pProvider, object pValue)
    {
        IWindowsFormsEditorService editorService = null;
        if (pContext != null && pContext.Instance != null && pProvider != null)
        {
            editorService = (IWindowsFormsEditorService)pProvider.GetService(typeof(IWindowsFormsEditorService));
            if (editorService != null)
            {
                //將顯示得視窗放在這邊,並透過ShowDialog方式來呼叫
                //取得到的值再回傳回去
                MessageBox.Show("sfsf");
            }
        }
        return pValue;
    }        
}
這時候我們將PropertyGridField的Column_B欄位設定成TestPopPropertyEditor,所以修改後的程式碼就會變成下面:
public class PropertyGridField
{       
    [Editor(typeof(ImageEditor), typeof(UITypeEditor))]
    public string Column_A { get; set; }

    [Editor(typeof(TestPopPropertyEditor), typeof(UITypeEditor))]
    public string Column_B { get; set; }

    [Browsable(false)]
    public string Column_C { get; set; }
}
然而顯示的畫面就會變成下面的樣子,在Column_B欄位多了一個「...」按鈕,並且點選後會出現一個對話視窗: