いろいろ備忘録日記

主に .NET と Python絡みのメモを公開しています。

DataGridView入門記-09 (カスタムオブジェクトのバインド)(カラム自動生成は無し)


DataGridViewに、カスタムオブジェクト,つまり自分で作成したデータクラスをバインド
するには、前回のようにBindingSourceを利用します。さらにDataGridViewのAutoGenerateColumns
プロパティをtrueにしておけば自動でカラムオブジェクトも作成してくれます。
でも、そのままだとカラム名がプロパティ名になってしまいます。
(例えば、"Name"というプロパティを定義している場合は、そのまま"Name"と出ます)
さらに、列の表示する順序も選べません。


サンプル程度ではいいのですが、実際にはプロパティ名のままのカラムヘッダーなどは
100%使わないでしょう。
(こういうとき、英語圏の人はいいなーって思ってみたり・・)


てことで、カラムをちゃんとした見た目にしてみます。


重要なプロパティは、以下です。

DataGridViewColumn.DataPropertyName


以下サンプルです。

// vim:set ts=4 sw=4 et ws is nowrap ft=cs:

using System;
using System.Collections.Generic;
using System.Windows.Forms;

using Gsf.Samples.Utility;

namespace Gsf.Samples.DGV{

    public class DataGridViewSample09 : BaseForm{

        public DataGridViewSample09() : base("Gsf.Samples.DGV.DataGridViewSample09"){
            // nop;
        }

        protected override void InitializeComponents(){
            //////////////////////////////////////////////////
            //
            // BindingSource.
            //
            BindingSource dataSource = new BindingSource();

            dataSource.Add(new D("gsf_zero1", 10));
            dataSource.Add(new D("gsf_zero2", 20));
            dataSource.Add(new D("gsf_zero3", 30));

            //////////////////////////////////////////////////
            //
            // DataGridView.
            //
            DataGridView grid = new DataGridView();

            grid.Dock                = DockStyle.Fill;
            // 自動サイズ調整
            grid.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;
            grid.AutoSizeRowsMode    = DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders;
            // カラム情報を自動で作成しないように
            grid.AutoGenerateColumns = false;

            grid.DataSource          = dataSource;

            //
            // カラム設定.
            //
            // DataGridViewColumnオブジェクトには、以下のプロパティが存在します。
            // -DataPropertyName
            // -HeaderText
            // カスタムオブジェクトをバインドし、カラムを自動作成しない場合は
            // 自前でカラム構造を構築します。
            // DataPropertyNameプロパティは、そのカラムにて表示するカスタムオブジェクトの
            // プロパティ名を指定します。(当然ですが、該当するプロパティはpublicである必要があります)
            // HeaderTextプロパティは、グリッドのヘッダーに表示される名称です。
            //
            DataGridViewColumn c = new DataGridViewTextBoxColumn();
            c.DataPropertyName = "Name";
            c.HeaderText       = "名前";

            grid.Columns.Add(c);

            c = new DataGridViewTextBoxColumn();
            c.DataPropertyName = "Age";
            c.HeaderText       = "年齢";

            grid.Columns.Add(c);

            Controls.Add(grid);
        }

        [STAThread]
        static void Main(){
            ApplicationUtility.Launch("Gsf.Samples.DGV.DataGridViewSample09");
        }
    }

    /// <summary>
    /// サンプル用のデータクラスです。
    /// </summary>
    class D{
        string _name;
        int    _age;

        public D(){
            _name = null;
            _age  = 0;
        }

        public D(string name, int age){
            _name = name;
            _age  = age;
        }

        public string Name{
            get{
                return _name;
            }
            set{
                _name = value;
            }
        }

        public int Age{
            get{
                return _age;
            }
            set{
                _age = value;
            }
        }
    }
}

================================
過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。