C# 名前付きの色一覧を配列に取得してRGB値をDataGridViewに表示する

Color構造体

.NET FrameworkのColor構造体はRGB値で色の指定もできるが,あらかじめRGB値が指定されていて名前を指定して使える色がある.「Color.Red」とか「Color.Green」といった感じで使うことが出来る.

本記事では,名前が付いた色の一覧を取得してColor構造体の配列に取得,さらにRGB値と色をDataGridViewに表示する方法を紹介する.

名前付きの色の取得

名前付きの色は,Color構造体の静的プロパティとして定義されている.色の一覧をColor構造体の配列に格納するコードは以下のようになる.

var colors = typeof(Color).GetProperties(BindingFlags.Static | BindingFlags.Public)
    .Select(p => Color.FromName(p.Name))
    .ToList();

1行目では,GetPropertiesメソッドを使って,Color構造体のパブリックな静的プロパティの型情報の一覧を取得している.BindingFlags構造体を使って取得するプロパティの検索方法を指定できるが,StaticとPublicを指定することでパブリックな静的プロパティを取得している.

2行目では,LINQSelectメソッドとhttp://msdn.microsoft.com/ja-jp/library/system.drawing.color.fromname(v=vs.110).aspx:Color.FromaNameメソッドを使って色の名前から,その色のColorオブジェクトを生成している.

3行目で,結果をListに変換している.(ListとかArrayとかに変換したほうが後の処理が楽なので)

DataGridViewで表示

取得した色の一覧をDataGridViewコントロールに表示する.

dataGridView1.DataSource = colors;

上記の一行を追加すると以下のように色の名前とRGB値が表示される.
f:id:whoopsidaisies:20140115195242p:plain

表示するプロパティの選択

上の画像だと「IsKnownColor」とかの余計なプロパティも表示されているので,表示しないようにする.

foreach (DataGridViewColumn col in dataGridView1.Columns)
    if (col.Name != "R" && col.Name != "G" && col.Name != "B" && col.Name != "Name")
        col.Visible = false;

DataGridViewの各列はVisibleプロパティによって表示・非表示を切り替えられるので,RGBと名前以外の列を非表示に設定している.

f:id:whoopsidaisies:20140115200155p:plain

セルの色付け

名前とRGB値だけだとどんな色か想像がつきにくいので,セルに色を付ける.ついでに名前が表示されている列を先頭にする.

for (int i = 0; i < colors.Count; ++i)
    dataGridView1["Name", i].Style.BackColor = colors[i];
dataGridView1.Columns["Name"].DisplayIndex = 0;

DataGridViewの各セルStyleプロパティによって色やフォント等の書式を指定出来る.ここではBackColorプロパティによって背景色を指定している.

また,DisplayIndexプロパティによって名前の表示列を先頭にしている.

実行すると以下のように名前のセルに色がついて表示される.(Transparentのところは後ろのウィンドウが表示されている.)

f:id:whoopsidaisies:20140115201854p:plain

ソースコード

上記コードをまとめると以下のようになる.

var colors = typeof(Color).GetProperties(System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public)
    .Select(p => Color.FromName(p.Name))
    .ToList();

dataGridView1.DataSource = colors;

foreach (DataGridViewColumn col in dataGridView1.Columns)
    if (col.Name != "R" && col.Name != "G" && col.Name != "B" && col.Name != "Name")
        col.Visible = false;

for (int i = 0; i < colors.Count; ++i)
    dataGridView1["Name", i].Style.BackColor = colors[i];
dataGridView1.Columns["Name"].DisplayIndex = 0;