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行目では,LINQのSelectメソッドとhttp://msdn.microsoft.com/ja-jp/library/system.drawing.color.fromname(v=vs.110).aspx:Color.FromaNameメソッドを使って色の名前から,その色のColorオブジェクトを生成している.
3行目で,結果をList
DataGridViewで表示
取得した色の一覧をDataGridViewコントロールに表示する.
dataGridView1.DataSource = colors;
上記の一行を追加すると以下のように色の名前とRGB値が表示される.
表示するプロパティの選択
上の画像だと「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と名前以外の列を非表示に設定している.
セルの色付け
名前と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のところは後ろのウィンドウが表示されている.)
ソースコード
上記コードをまとめると以下のようになる.
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;