DataGridViewクラスのインスタンスを生成し、列名とデータを表示するプログラムを下に示す。
using System; using System.Windows.Forms; class Program { [STAThread] static void Main() { Application.EnableVisualStyles(); Application.Run(new DataGrid()); } } class DataGrid : Form { string[] heads = { "a", "b", "c" }; string[][] data = { new string[] {"1", "2", "3"}, new string[] {"11", "12", "13"} }; public DataGrid() { Text = "DataGridView Test"; DataGridView dataGridView = new DataGridView() { Dock = DockStyle.Fill }; dataGridView.ColumnCount = heads.Length; for (int i = 0; i < heads.Length; i++) dataGridView.Columns[i].Name = heads[i]; for (int j = 0; j < data.Length; j++) dataGridView.Rows.Add(data[j]); this.Controls.Add(dataGridView); } }
行番号を表示する方法は色々ある。 その中で比較的にシンプルなのが DataGridViewRowPostPaint イベントを使う方法である。 プログラムを下に示す。
using System; using System.Drawing; using System.Windows.Forms; class Program { [STAThread] static void Main() { Application.EnableVisualStyles(); Application.Run(new DataGrid()); } } class DataGrid : Form { string[] heads = { "a", "b", "c" }; string[][] data = { new string[] {"1", "2", "3"}, new string[] {"11", "12", "13"} }; public DataGrid() { Text = "DataGridView Test"; DataGridView dataGridView = new DataGridView() { Dock = DockStyle.Fill }; dataGridView.RowPostPaint += new DataGridViewRowPostPaintEventHandler(rowPostPaint); dataGridView.ColumnCount = heads.Length; for (int i = 0; i < heads.Length; i++) dataGridView.Columns[i].Name = heads[i]; for (int j = 0; j < data.Length; j++) dataGridView.Rows.Add(data[j]); this.Controls.Add(dataGridView); } // 行番号を表示する private void rowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) { Rectangle rect = e.RowBounds; rect.Width = ((DataGridView)sender).RowHeadersWidth - 4; TextRenderer.DrawText(e.Graphics, (e.RowIndex+1).ToString(), e.InheritedRowStyle.Font, rect, e.InheritedRowStyle.ForeColor, TextFormatFlags.Right | TextFormatFlags.VerticalCenter); } }
DataGridViewCellPaintingイベントを使って行番号を表示するには、次のようにする。
dataGridView.CellPainting += new DataGridViewCellPaintingEventHandler(cellPainting); private void cellPainting(object sender, DataGridViewCellPaintingEventArgs e) { if (e.ColumnIndex < 0 && e.RowIndex >= 0) { e.Paint(e.ClipBounds, DataGridViewPaintParts.All); Rectangle indexRect = e.CellBounds; indexRect.Inflate(-2, -2); TextRenderer.DrawText(e.Graphics, (e.RowIndex + 1).ToString(), e.CellStyle.Font, indexRect, e.CellStyle.ForeColor, TextFormatFlags.Right | TextFormatFlags.VerticalCenter); e.Handled = true; // 描画が完了したことを知らせる } }
次のプログラムでは、列名の表示を中央揃え、データセルの表示を右揃えに変更している。 デフォルトは左揃えである。
// datagrid.cs 2013.10.31 by Minoru Hatada using System; using System.Drawing; using System.Windows.Forms; class Program { [STAThread] static void Main() { Application.EnableVisualStyles(); Application.Run(new DataGrid()); } } class DataGrid : Form { string[] heads = { "a", "b", "c" }; string[][] data = { new string[] {"1", "2", "3"}, new string[] {"11", "12", "13"} }; public DataGrid() { Text = "DataGridView Test"; DataGridView dataGridView = new DataGridView() { Dock = DockStyle.Fill }; dataGridView.RowPostPaint += new DataGridViewRowPostPaintEventHandler(rowPostPaint); dataGridView.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; // 列名を中央揃えに dataGridView.ColumnCount = heads.Length; for (int i = 0; i < heads.Length; i++) { dataGridView.Columns[i].Name = heads[i]; dataGridView.Columns[i].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight; } for (int j = 0; j < data.Length; j++) dataGridView.Rows.Add(data[j]); this.Controls.Add(dataGridView); } // 行番号を表示する private void rowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) { Rectangle rect = e.RowBounds; rect.Width = ((DataGridView)sender).RowHeadersWidth - 4; TextRenderer.DrawText(e.Graphics, (e.RowIndex+1).ToString(), e.InheritedRowStyle.Font, rect, e.InheritedRowStyle.ForeColor, TextFormatFlags.Right | TextFormatFlags.VerticalCenter); } }
末尾に行を追加するときはdataGridView.Rows.Add()
メソッドを使用する。
特定の位置 rowIndex に行を追加するときはdataGridView.Rows.Insert(rowIndex, dataGridViewRow)
メソッドを使用する。
全ての行を削除するには dataGridView.Rows.Clear()
メソッドを使用する。
特定の行 rowToDelete を削除するには dataGridView.Rows.RemoveAt(rowToDelete); とする。
dataGrid.AllowUserToAddRows
を false に設定すると、
DataGridの一番下に表示される新しい行(*行)が表示されなくなる。
ただし、この状態では、表示された行のセルの編集は可能である。
dataGrid.ReadOnly
プロパティを true とすると、セルの編集も出来なくなる。
なお、dataGrid.ReadOnlyプロパティを true としただけの場合は、入力はできないが、 一番下に空行が表示される。このような使い方は一般的にはないであろう。
RowHeadersVisibleプロパティに false を設定すると、行ヘッダは表示されなくなる。
指定した列や行を非表示にするには、列(DataGridViewColumnオブジェクト)や 行(DataGridViewRowオブジェクト)のVisibleプロパティをfalseにする。 例えば dataGridView.Columns[3].Visible = false のようにする。
例えば、
dataGridView.Columns[1].Frozen = true;とすると、dataGridViewの左の2列が固定され、スクロールされなくなる。 同様に、
dataGridView.Rows[0].Frozen = true;とすると、dataGridViewの一番上の行が固定され、スクロールされなくなる。
次のプログラムで行が固定されていることを確認した。
using System; using System.Windows.Forms; class Program { [STAThread] static void Main() { Application.EnableVisualStyles(); Application.Run(new DataGrid()); } } class DataGrid : Form { string[] heads = { "品名", "数量", "単価", "売上高" }; string[][] data = { new string[] {"abcd", "1", "200", "200"}, new string[] {"何か", "10", "500", "5000"}, new string[] {"あれ", "5", "200", "1000"}, new string[] {"これ", "10", "400", "4000"}, }; public DataGrid() { Text = "DataGridView Test"; DataGridView dataGridView = new DataGridView() { Dock = DockStyle.Fill, AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells, }; dataGridView.ColumnCount = heads.Length; for (int i = 0; i < heads.Length; i++) { dataGridView.Columns[i].Name = heads[i]; dataGridView.Columns[i].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight; dataGridView.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable; } for (int j = 0; j < data.Length; j++) { dataGridView.Rows.Add(data[j]); } dataGridView.Rows[0].Frozen = true; // 先頭行を固定する this.Controls.Add(dataGridView); } }
下の画面はスクロールによって2行目が隠れた状態である。1行目は固定されている。
この画面から分かるように、列名と境界線の間に少し余白がある。この余白を縮小する方法があるか調べたが、 簡単ではないことが分かった。カスタムドローのような方法しかないようだ。 DataGridViewAutoSizeColumnsMode.AllCells は使えないので、そこまで手数をかけて変更するほどのものでもないだろう。
全ての行の高さを例えば18ピクセルに変更するには、データをセットする前に dataGridView.RowTemplate.Height = 18 を実行する。
列ヘッダの高さを 50 ピクセルに設定するには dataGridView.ColumnHeadersHeight = 50 とする。
デフォルトでは行の高さや列の幅はマウス操作で変更できる(境界線をドラッグする)。
dataGridView.AllowUserToResizeColumns = false; // dataGridViewの列の幅をユーザーが変更できないようにする dataGridView.AllowUserToResizeRows = false; // dataGridViewの行の高さをユーザーが変更できないようにする
特定の列 m、行 n に対しては dataGridView.Columns[m].AllowUserToResizeColumns、 dataGridView.Rows[n].AllowUserToResizeColumns を false にする。
セルの余白を好みの値に設定するには dataGridView.RowTemplate.DefaultCellStyle.Padding プロパティに余白(「左」「上」「右」「下」)を設定する。 このとき、余白に応じてセルの高さを修正する必要がある。 下に、プログラム例と実行画面を示す。
// dgv01.cs using System; using System.Windows.Forms; class Program { [STAThread] static void Main() { Application.EnableVisualStyles(); Application.Run(new DataGrid()); } } class DataGrid : Form { string[] heads = { "a", "b", "c" }; string[][] data = { new string[] {"1", "2", "3"}, new string[] {"11", "12", "13"} }; public DataGrid() { Text = "DataGridView Test"; DataGridView dataGridView = new DataGridView() { Dock = DockStyle.Fill }; dataGridView.RowTemplate.DefaultCellStyle.Padding = new Padding(5,5,5,7); dataGridView.RowTemplate.Height += 7; dataGridView.ColumnCount = heads.Length; for (int i = 0; i < heads.Length; i++) dataGridView.Columns[i].Name = heads[i]; for (int j = 0; j < data.Length; j++) dataGridView.Rows.Add(data[j]); this.Controls.Add(dataGridView); } }
余白をゼロにすると、下のように、スリムな表にできる。
プログラムを下に示す。列名の後ろのソートのマークを消すために、 列の SortMode を DataGridViewColumnSortMode.NotSortable としている。
左端の行ヘッダを消すために dataGridView.RowHeadersVisible = false としている。
// dgv1.cs using System; using System.Windows.Forms; class Program { [STAThread] static void Main() { Application.EnableVisualStyles(); Application.Run(new DataGrid()); } } class DataGrid : Form { string[] heads = { "列1", "列2", "列3" }; string[][] data = { new string[] {"1111", "2222", "3333"}, new string[] {"4444", "5555", "6666"} }; public DataGrid() { Text = "DataGridView Test"; DataGridView dataGridView = new DataGridView() { Dock = DockStyle.Fill }; dataGridView.RowHeadersVisible = false; dataGridView.AllowUserToAddRows = false; dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; dataGridView.ColumnHeadersDefaultCellStyle.Padding = new Padding(0); dataGridView.RowTemplate.DefaultCellStyle.Padding = new Padding(0); dataGridView.ColumnHeadersHeight = 20; dataGridView.RowTemplate.Height -= 6; dataGridView.ColumnCount = heads.Length; for (int i = 0; i < heads.Length; i++) { dataGridView.Columns[i].Name = heads[i]; dataGridView.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable; } for (int j = 0; j < data.Length; j++) { dataGridView.Rows.Add(data[j]); } this.Controls.Add(dataGridView); } }
Marginプロパティにゼロを設定しても、デフォルトで僅かな余白が加えられる。 特に、列名(ColumnHeaders)に大き目の余白が加えられるようである。 これらの余白も無くすには、次のプログラムに示すように、 DataGridViewCellPaintingEventHandlerを使って自分で描画すればよい。 セルの幅や高さや文字列の配置は予め設定しておく。 (通常は、手間をかけてここまでこだわる必要はないだろうが)
dataGridView.CellPainting += new DataGridViewCellPaintingEventHandler(cellPainting); void cellPainting(object sender, DataGridViewCellPaintingEventArgs e) { e.PaintBackground(e.ClipBounds, true); string text = Convert.ToString(e.FormattedValue); Color color = text.StartsWith("-") ? Color.Red : Color.Black; TextRenderer.DrawText(e.Graphics, text, e.CellStyle.Font, e.CellBounds, color, TextFormatFlags.HorizontalCenter); e.Handled = true; }
多数のセルにツールチップを付けるにはCellToolTipTextNeededイベントを使用する方がよさそう。 特定のセルにツールチップを付けるにはDataGridViewColumn.ToolTipTextプロパティの方が簡単である。 列ヘッダに対しては dataGridView.Columns[nCol].ToolTipText、行ヘッダでは dataGridView.Rows[nRow].HeaderCell.ToolTipText、データセルでは dataGridView[nCol,nRow].ToolTipText に文字列をセットする。
DataGridViewコントロールでは、アプリケーションの実行開始時にデフォルトで左上隅(1行1列目) のセルが自動的に選択され、反転状態となる。 起動時にセルが選択されないようにするには、CurrentCellプロパティに null をセットすればよい。
ただし、DataGridViewが表示されてから CurrentCellプロパティに null をセットする必要があるため、 例えば、次のようにする。
public class MyForm : Form { DataGridView dataGridView; // フォームのコンストラクタ public MyForm() { dataGridView = new DataGridView() { Dock = DockStyle.Fill }; this.Controls.Add(dataGridView); this.Shown += (s,e) => { dataGridView.CurrentCell = null; }; } }
この場合には、マウスでセルをクリックしたときは、セルが反転状態となる。 コンストラクタで、次のようにすれば、セルの選択ができなくなるため、セルをクリックしても反転表示は起きない。
CurrentCell = null; SelectionChanged += (s,e) => { CurrentCell = null; };
起動時にセルを nCol列、nRow行 に設定するには、次のようにする。
dataGridView.FirstDisplayedCell = dataGridView[nCol,nRow];
カレントセルを nCol列、nRow行 に設定するには、次のようにする。
dataGridView.CurrentCell = dataGridView[nCol,nRow];
セルの値は Valueプロパティ(Object型)で取得・設定する。
デフォルトではセルをクリックすると個々のセルが選択される。 クリックしたセルを含む行全体が選択されるようにするには、次のようにする。
dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
背景色などは Styleプロパティに含まれる。 例えば、背景色の設定は次のようにする。
dataGridView[nCol,nRow].Style.BackColor = Color.Aquamarine;
行全体、列全体の背景色を設定するには、次のようにする。
dataGridView.Rows[nRow].DefaultCellStyle.BackColor = Color.Aquamarine; dataGridView.Columns[nCol].DefaultCellStyle.BackColor = Color.Aquamarine;
文字色を設定するときは、BackColor を ForeColor に変更する。
行nRowが画面に表示されていないとき、画面の先頭に表示するようにスクロールするには、 次のようにする。
if (!dataGridView.Rows[nRow].Displayed) dataGridView.FirstDisplayedScrollingRowIndex = nRow;