Home / ぼやきごと / 2013-04-14
2013-04-14

C#: PropertyGrid のカテゴリを強引に任意順序で表示する

.NET Framework には PropertyGrid という便利なコントロールがあります。
Visual Studio のプロパティウィンドウにも使われているアレです。

基本的な使い方は上記のサイトを読めばわかると思います。

PropertyGrid に渡すオブジェクトのプロパティに CategoryAttribute 属性を適用すると、指定したカテゴリ名でグループ分けして表示してくれます。

MyData.cs
すべて開くすべて閉じる
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 
 
 
 
-
|
-
|
|
|
|
|
|
|
|
!
!
using System;
using System.ComponentModel;
 
namespace TestWinApp
{
    class MyData
    {
        [Category("カテゴリX")]
        public int Value1 { get; set; }
        [Category("カテゴリX")]
        public int Value2 { get; set; }
        [Category("カテゴリY")]
        public int Value3 { get; set; }
        [Category("カテゴリY")]
        public int Value4 { get; set; }
    }
}
Form1.cs
すべて開くすべて閉じる
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 
 
 
 
-
|
-
|
-
|
!
|
|
-
|
!
!
!
using System;
using System.Windows.Forms;
 
namespace TestWinApp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            propertyGrid1.SelectedObject = new MyData();
        }
    }
}
表示例
(PropertyGrid のカテゴリ別表示例)

便利ですね。

ここでふと「カテゴリY、カテゴリXの順に表示したい」と考えたとします。
しかしカテゴリの表示順序を制御するための方法は用意されておらず、常に文字コード順でソートされてしまいます。
カテゴリ名を「1. カテゴリY」「2. カテゴリX」のようにする手もありますが、できれば余計な文字を入れずに任意順序で表示したいものです。

何か方法は無いかとググってみたところ、2chの過去ログにこんなものがありました。

http://www.logsoku.com/r/tech/1274019232/8-9
カテゴリ名の先頭にタブ文字(\t)を入れまくる

つまり次のように、上に表示したいカテゴリほど先頭にタブ文字をたくさん入れるというものです。
先頭のタブ文字は表示されないので、任意順序で並んでいるように見えるというわけです。

MyData.cs
すべて開くすべて閉じる
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 
 
 
 
-
|
-
|
|
|
|
|
|
|
|
!
!
using System;
using System.ComponentModel;
 
namespace TestWinApp
{
    class MyData
    {
        [Category("\tカテゴリX")]
        public int Value1 { get; set; }
        [Category("\tカテゴリX")]
        public int Value2 { get; set; }
        [Category("\t\tカテゴリY")]
        public int Value3 { get; set; }
        [Category("\t\tカテゴリY")]
        public int Value4 { get; set; }
    }
}
表示例
(PropertyGrid でカテゴリを任意順に並べた表示例)

かなり強引な解決手法ですが、確かに任意順序で表示できました。
目から鱗ですね。

どの環境でも先頭のタブ文字が表示されないという保証は無いですが、Windowsでだけ動けばいいならこういう手もあるよということで。

Category: [プログラミング][C#] - 2013-04-14 22:56:45