いろいろ備忘録日記

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

DataGridView入門記-21 (表示時に値を変換する/入力された値を変換する)(CellFormatting, CellParsing)


セルの値を表示時に、値を変換して表示するには以下のイベントを使用します。

  • CellFormattingイベント


また、通常CellFormattingイベントを処理する場合はCellParsingイベントも処理します。
CellParsingイベントはCellFormattingの逆を行うものでセルの値を特定の値に変換します。


以下、サンプルです。

// vim:set ts=4 sw=4 et ws is nowrap ft=cs:
using System;
using System.Data;
using System.Data.Common;
using System.Drawing;
using System.Windows.Forms;

namespace Gsf.Demo{

    public class DemoForm : Form{

        Button       btnExec;
        DataGridView grdMain;
        DataTable    _table;

        public DemoForm(){
            InitializeComponent();
            InitializeControlData();
            InitializeEventSettings();
            InitializeDataBindings();
        }

        protected void InitializeComponent(){
            SuspendLayout();

            Text          = "DataGridView Sample";
            Size          = new Size(400, 500);
            StartPosition = FormStartPosition.CenterScreen;

            btnExec = new Button();
            btnExec.Text = "確認";
            btnExec.Dock = DockStyle.Top;

            grdMain = new DataGridView();
            grdMain.Dock                = DockStyle.Fill;
            grdMain.AutoGenerateColumns = true;

            Controls.Add(btnExec);
            Controls.Add(grdMain);

            ResumeLayout();
        }

        protected void InitializeControlData(){

            if(_table == null){
                _table = new DataTable("GRID_SOURCE");

                _table.Columns.Add("ID");
                _table.Columns.Add("NAME");
                _table.Columns.Add("SEX", typeof(int));

                for(int i = 0; i < 100; i++){

                    int mod = ((i + 1) % 2);

                    DataRow newRow   = _table.NewRow();
                    newRow.ItemArray = new object[]{i, string.Format("gsf_zero{0}", i), mod};
                    _table.Rows.Add(newRow);
                }
            }
        }

        protected void InitializeEventSettings(){

            btnExec.Click += (s, e) => {
                //
                // 値の確認.
                //
                // 性別列のどこかを選択した状態で本ボタンをクリックするとParseされた値が
                // 確認できます。
                // 
                MessageBox.Show(grdMain.CurrentCell.Value.ToString());

            };

            grdMain.CellFormatting += (s, e) => {

                DataGridView grid = s as DataGridView;

                if(grid != null){

                    if(grid.Columns[e.ColumnIndex].Name == "SEX"){

                        if(e.Value != null){
                            //
                            // 変換.
                            //
                            e.Value = (e.Value.Equals(0)) ? "男性" : "女性";

                            //
                            // 後続の書式変換処理を行う.
                            // (行わない場合はtrueを指定.)
                            //
                            e.FormattingApplied = false;
                        }
                    }
                }
            };

            grdMain.CellParsing += (s, e) => {

                DataGridView grid = s as DataGridView;

                if(grid != null){

                    if(grid.Columns[e.ColumnIndex].Name == "SEX"){

                        if(e.Value != null){

                            try{
                                object original = e.Value;

                                //
                                // 変換.
                                //
                                e.Value = int.Parse(( e.Value.Equals("男性") ) ? "0" : "1");

                                //
                                // セルの値が正常に解析できた事を示す。
                                //
                                e.ParsingApplied = true;

                                MessageBox.Show(string.Format("値が変換されました. (元:{0} => 後:{1})", original, e.Value));
                            }catch{
                                //
                                // セルの解析に失敗.
                                //
                                e.ParsingApplied = false;
                            }
                        }
                    }
                }
            };
        }

        protected void InitializeDataBindings(){

            grdMain.DataSource = new BindingSource(_table, "");

        }

        [STAThread]
        static void Main(){
            Application.EnableVisualStyles();
            Application.Run(new DemoForm());
        }
    }
}


アプリを起動後、性別が表示されている列の値を"男性"もしくは"女性"と入力すると
値が変換されます。(CellParsingイベントが発生します。)


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

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