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

いろいろ備忘録日記

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

DataGridView入門記-10 (列の表示・非表示・削除)


ある条件の場合に、特定の列を非表示にしたり削除したりするのはよくあることです。


DataGridViewでそれを行うには、該当の列オブジェクトを取得する必要があります。


列オブジェクトの取得は、

DataGridView.Columns[列名]

で取得できます。列名には、ターゲットとなる列オブジェクトの
Nameプロパティの値です。


表示・非表示は、上記の列オブジェクトの以下のプロパティをON/OFFします。

DataGridViewColumn.Visible


また、列を削除する場合は、以下のメソッドを使用します。

DataGridView.Columns.Remove(列名)

列名には、ターゲットとなる列オブジェクトのNameプロパティの値です。


以下サンプルです。
このサンプルでは、フォーム上部に非表示と削除のボタンがあり、
それぞれ押下することによって、フォーム下部のグリッドの列数が
変化します。

非表示ボタンもしくは、削除ボタンを押下した場合は、復活ボタンが
可視化されます。
復活ボタンを押下すると、グリッドの列が復活します。

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

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

using Gsf.Samples.Utility;

namespace Gsf.Samples.DGV{

    /// <summary>
    /// 列の削除と非表示のサンプルです。
    /// </summary>
    public class DataGridViewSample10 : BaseForm{

        // ボタン処理用のデリゲート
        delegate void ButtonProcess();

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

        protected override void InitializeComponents(){
            ////////////////////////////////////////
            //
            // DataGridView & BindingSource
            //
            DataGridView grid = new DataGridView();

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

            DataGridViewColumn col = new DataGridViewTextBoxColumn();
            col.Name             = "id";
            col.DataPropertyName = "Id";
            col.HeaderText       = "ID";

            grid.Columns.Add(col);

            col = new DataGridViewTextBoxColumn();
            col.Name             = "name";
            col.DataPropertyName = "Name";
            col.HeaderText       = "名前";

            grid.Columns.Add(col);

            col = new DataGridViewTextBoxColumn();
            col.Name             = "age";
            col.DataPropertyName = "Age";
            col.HeaderText       = "年齢";

            grid.Columns.Add(col);

            DataGridViewColumn addressColumn = new DataGridViewTextBoxColumn();
            addressColumn.Name             = "address";
            addressColumn.DataPropertyName = "Address";
            addressColumn.HeaderText       = "住所";

            grid.Columns.Add(addressColumn);

            DataGridViewColumn memoColumn = new DataGridViewTextBoxColumn();
            memoColumn.Name             = "memo";
            memoColumn.DataPropertyName = "Memo";
            memoColumn.HeaderText       = "備考";

            grid.Columns.Add(memoColumn);

            /////////////////////////////////////////
            //
            // Buttons.
            //
            Button btnNotVisible = new Button();
            Button btnRemove     = new Button();
            Button btnRebirth    = new Button();

            btnNotVisible.Text = "非表示";
            btnRemove.Text     = "削除";
            btnRebirth.Text    = "復活";

            // デフォルトでは、復活ボタンは非表示
            btnRebirth.Visible = false;

            //
            // 復活ボタン可視化時の処理.
            //
            ButtonProcess rebirthButtonVisibleRoutine = delegate(){
                btnNotVisible.Visible = false;
                btnRemove.Visible     = false;
                btnRebirth.Visible    = true;
            };

            //
            // 復活ボタン不可視化時の処理.
            //
            ButtonProcess rebirthButtonNotVisibleRoutine = delegate(){
                btnNotVisible.Visible = true;
                btnRemove.Visible     = true;
                btnRebirth.Visible    = false;
            };

            btnNotVisible.Click += delegate(object sender, EventArgs e){
                //
                // AddressとMemo列を非表示に.
                //
                grid.Columns["address"].Visible = false;
                grid.Columns["memo"].Visible    = false;

                //
                // 非表示と削除のボタンを非表示にし、復活ボタンを可視化.
                //
                rebirthButtonVisibleRoutine();
            };

            btnRemove.Click += delegate(object sender, EventArgs e){
                //
                // AddressとMemo列を削除.
                //
                grid.Columns.Remove("address");
                grid.Columns.Remove("memo");

                //
                // 非表示と削除のボタンを非表示にし、復活ボタンを可視化.
                //
                rebirthButtonVisibleRoutine();
            };

            btnRebirth.Click += delegate(object sender, EventArgs e){
                //
                // 削除ボタンによって、列が削除されている場合は列オブジェクトを復活.
                //
                if(!grid.Columns.Contains("address") && !grid.Columns.Contains("memo")){

                    grid.Columns.Add(addressColumn);
                    grid.Columns.Add(memoColumn);

                }

                //
                // 列を可視化.
                //
                grid.Columns["address"].Visible = true;
                grid.Columns["memo"].Visible    = true;

                //
                // 非表示と削除のボタンを表示にし、復活ボタンを非表示.
                //
                rebirthButtonNotVisibleRoutine();
            };

            ////////////////////////////////////////
            //
            // TableLayoutPanel
            //
            TableLayoutPanel p = new TableLayoutPanel();

            p.Dock        = DockStyle.Fill;
            p.ColumnCount = 3;

            p.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 70F));
            p.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 70F));
            p.ColumnStyles.Add(new ColumnStyle(SizeType.Percent,  100F));

            p.RowStyles.Add(new RowStyle(SizeType.Absolute, 35F));
            p.RowStyles.Add(new RowStyle(SizeType.Percent,  100F));

            p.Controls.Add(btnNotVisible);
            p.Controls.Add(btnRemove);
            p.Controls.Add(btnRebirth);
            p.Controls.Add(grid);

            p.SetColumnSpan(grid, 3);

            Controls.Add(p);

            ////////////////////////////////////////
            //
            // other settings & Events.
            //
            Size = new Size(600, 300);
            //
            // Load Event.
            //
            Load += delegate(object sender, EventArgs e){
                //
                // [注意] FormのLoadイベント時にフォーカスの
                // 設定をしても、反映されません。
                // Load時にフォーカスを設定するには、ActiveControlプロパティ
                // にアクティブにしたいコントロールを設定します.
                //
                ActiveControl = grid;
            };
        }

        object GetDataSource(){
            BindingSource source = new BindingSource();

            source.DataSource = typeof(SampleData);

            PopulateData(source);

            return source;
        }

        void PopulateData(BindingSource source){
            for(int i = 0; i < 3; i++){
                SampleData data = new SampleData();

                data.Id      = i;
                data.Name    = "name-" + i;
                data.Age     = i + 20;
                data.Address = "address-" + i;
                data.Memo    = "Memo-" + i;

                source.Add(data);
            }
        }

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

    /// <summary>
    /// サンプルデータクラスです。
    /// </summary>
    /// <remarks>
    /// プロパティとして以下のものを持ちます。
    /// -Id
    /// -Name
    /// -Age
    /// -Address
    /// -Memo
    /// </remarks>
    class SampleData{
        int    _id;
        string _name;
        int    _age;
        string _address;
        string _memo;

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

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

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

        public string Address{
            get{
                return _address;
            }
            set{
                _address = value;
            }
        }

        public string Memo{
            get{
                return _memo;
            }
            set{
                _memo = value;
            }
        }
    }
}


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

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