C# プロパティグリッドの表示順を定義順にソートする

ちょっとした設定画面などは、プロパティグリッド(PropertyGridコントロール)を使用すると簡単に作成することができます。ただし、表示順が自動的にアルファベット順にソートされてしまうのが問題になる場合があります。

プロパティグリッドがアルファベット順にソートされて表示

この問題を解決する為に「TypeConverter 属性」を使用します。ほとんどの場合、クラスで定義した順番に表示すれば都合が良いので、プロパティグリッドの表示順を定義順にソートする為の汎用的なクラスを作成します。

using System;
using System.Reflection;
using System.ComponentModel;
using System.Collections.Generic;
     
namespace DefinitionOrderTypeConverter
{
    /// <summary>
    /// プロパティグリッドのプロパティの並び順をソート
    /// </summary>
    class DefinitionOrderTypeConverter : TypeConverter
    {
        public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes)
        {
            // TypeDescriptorを使用してプロパティ一覧を取得する
            PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(value, attributes);
     
            // プロパティ一覧をリフレクションから取得
            Type type = value.GetType();
            List<string> list = new List<string>();
            foreach (PropertyInfo propertyInfo in type.GetProperties())
            {
                list.Add(propertyInfo.Name);
            }
     
            // リフレクションから取得した順でソート
            return pdc.Sort(list.ToArray());
        }
     
        /// <summary>
        /// GetPropertiesをサポートしていることを表明する。
        /// </summary>
        public override bool GetPropertiesSupported(ITypeDescriptorContext context)
        {
            return true;
        }
    }
}
			

リフレクションを使用してプロパティ一覧を取得した際、クラスで定義した順で取得できることを利用しています。後は、プロパティグリッドを使用するクラスにこの属性を付加します。

using System;
using System.ComponentModel;
    
namespace DefinitionOrderTypeConverter
{
    [TypeConverter(typeof(DefinitionOrderTypeConverter))]
    class People
    {
        public string Name { getset; }
    
        public string Kana { getset; }
    
        public int Age { getset; }
    
        public int Height { getset; }
     
        public int Weight { getset; }
     
        public string Group { getset; }
    }
}

表示順が自動的にアルファベット順から定義順に変わっていることが確認できます。

プロパティグリッドがアルファベット順にから定義順にソートされて表示
使用環境: Visual Studio 2010

C# メニューリスト