ある条件の場合に、特定の列を非表示にしたり削除したりするのはよくあることです。
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; } } } }
================================
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ
サンプルコードは、以下の場所で公開しています。
- いろいろ備忘録日記サンプルソース置き場