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

ちょっとした設定画面などは、プロパティグリッド(PropertyGridコントロール)を使用すると簡単に作成することができます。

プロパティグリッドでドロップダウンリストから選択肢を表示したい場合、通常はEnum型を使用すれば良いのですが、何らかの理由でEnum型が使用できない場合の方法を説明します。

プロパティグリッドで文字列のドロップダウンリストを表示

ここではstring型のプロパティにドロップダウンリストの選択肢を追加します。ListBoxを使用して選択肢を表示するUITypeEditorクラスを作成します。

using System;
using System.Drawing.Design;
using System.Windows.Forms;
using System.Windows.Forms.Design;
using System.ComponentModel;
     
namespace UITypeEditorDropDown
{
    class UITypeEditorDropDown : UITypeEditor
    {
        public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
        {
            return UITypeEditorEditStyle.DropDown;
        }
     
        public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
        {
            IWindowsFormsEditorService s = provider.GetService(typeof(IWindowsFormsEditorService)) as IWindowsFormsEditorService;
     
            if (s != null)
            {
                var list = new ListBox();
     
                // リストボックスに項目をセット
                list.Items.Add("一般人");
                list.Items.Add("芸能人");
                list.Items.Add("その他");
     
                // リストの項目に一致するものがあれば選択する
                if (list.Items.Contains(value.ToString()))
                {
                    list.SelectedItem = value.ToString();
                }
     
                // クリックで閉じるようにする
                EventHandler onclick = (sender, e) =>
                {
                    s.CloseDropDown();
                };
     
                list.Click += onclick;
     
                // ドロップダウンリストの表示
                s.DropDownControl(list);
     
                list.Click -= onclick;
     
                // 選択されていればその値を返す
                return (list.SelectedItem != null) ? list.SelectedItem : value;
            }
            return value;
        }
    }
}

後は、対象のプロパティにこの属性を付加します。

using System;
using System.ComponentModel;
using System.Drawing.Design;
    
namespace UITypeEditorDropDown
{
    class People
    {
        public string Name { getset; }
    
        public string Kana { getset; }
    
        public int Age { getset; }
    
        public int Height { getset; }
    
        public int Weight { getset; }
    
        [Editor(typeof(UITypeEditorDropDown), typeof(UITypeEditor))]
        public string Group { getset; }
    }
}

UITypeEditorについての詳細はMSDNなどを参考にしてください。

http://msdn.microsoft.com/ja-jp/library/system.drawing.design.uitypeeditor(v=vs.110).aspx
使用環境: Visual Studio 2010

C# メニューリスト