読者です 読者をやめる 読者になる 読者になる

いろいろ備忘録日記

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

DataGridView入門記-18 (セルの値が変更された際のイベント)(CellValueChanged, CellEnter)

CellValueChangedイベントは、文字通りセルの値が変更された際に発生します。
このイベントは、セルの値がコミットされた時に発生します。


DGV関連で、最も使用されるイベントの一つではないでしょうか。


以下サンプルです。
以下のサンプルでは、セルにフォーカスが当たった時点で現在の値を保持しておき
CellValueChangedイベント発生時に、元の値と現在の値を表示するようになっています。

using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

namespace Gsf.Samples.CSharp {

    /// <summary>
    /// DataGridView.CellValueChangedイベントのサンプルです。
    /// </summary>
    /// <remarks>
    /// CellValueChangedイベントは、セルのデータが変更された際に
    /// 発生します。
    /// </remarks>
    public partial class MainForm : Form {

        /// <summary>
        /// 変更される前のセルの値.
        /// </summary>
        string _oldCellValue;

        public MainForm() {
            InitializeComponent();
            //
            // イベントを設定
            //
            DispatchEvents();
        }

        private void DispatchEvents() {
            Load += new EventHandler(MainForm_Load);
        }

        /// <summary>
        /// フォームのロード時にコールバックされます。
        /// </summary>
        /// <param name="sender">イベント送信元</param>
        /// <param name="e">イベント引数</param>
        void MainForm_Load(object sender, EventArgs e) {

            Text = "DataGridViewSample18";

            DataGridView grid = new DataGridView();

            grid.Dock       = DockStyle.Fill;
            grid.DataSource = GetDataSource();
            grid.EditMode   = DataGridViewEditMode.EditOnEnter;

            //
            // イベントを設定します。
            //
            grid.CellEnter        += new DataGridViewCellEventHandler(grid_CellEnter);
            grid.CellValueChanged += new DataGridViewCellEventHandler(grid_CellValueChanged);

            Controls.Add(grid);
            Size = new Size(400, 300);
        }

        /// <summary>
        /// セルにフォーカスが当たった際にコールバックされます。
        /// </summary>
        /// <param name="sender">イベント送信元</param>
        /// <param name="e">イベント引数</param>
        void grid_CellEnter(object sender, DataGridViewCellEventArgs e) {
            //
            // 元の値を保持.
            //
            DataGridView grid = sender as DataGridView;

            if(grid != null){

                _oldCellValue = grid[e.ColumnIndex, e.RowIndex].Value.ToString();
            }
        }

        /// <summary>
        /// セルの値が変更された際にコールバックされます。
        /// </summary>
        /// <param name="sender">イベント送信元</param>
        /// <param name="e">イベント引数</param>
        void grid_CellValueChanged(object sender, DataGridViewCellEventArgs e) {
            //
            // 元の値と現在の値を表示.
            //
            DataGridView grid = sender as DataGridView;

            if(grid != null){

                string cellValue = grid[e.ColumnIndex, e.RowIndex].Value.ToString();

                string message   = string.Format("元の値:{0} ⇒ 現在の値:{1}", _oldCellValue, cellValue);

                MessageBox.Show(this, message, "値が変更されました。");
            }

            
        }

        object GetDataSource() {

            BindingSource source = new BindingSource();

            source.DataSource = typeof(Model);

            source.Add(new Model(1.ToString(), "gsf_zero1", 20.ToString()));
            source.Add(new Model(2.ToString(), "gsf_zero2", 21.ToString()));
            source.Add(new Model(3.ToString(), "gsf_zero3", 22.ToString()));

            return source;

        }
    }

    /// <summary>
    /// グリッドで使用するデータモデルです。
    /// </summary>
    internal class Model {
        string _id;
        string _name;
        string _age;

        public Model(string id, string name, string age) {
            _id   = id;
            _name = name;
            _age  = age;
        }

        public string Id {
            get {
                return _id;
            }
            set {
                _id = value;
            }
        }

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

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

}


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

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