DGV解体新書 > DataGridViewプログラミング概要
のぶ亭『プログラミングの相談窓口』 … 様々なプログラミング問題を個別対応致します |
DataGridViewの基本概念と操作を体感で学ぶ
デザイナーで表示されない非公開プロパティがリアルで見える
DataGridViewの基本的な考え方・使い方を簡単にマスターするフリー学習ソフト「DGVPad」
ダウンロード & マニュアル
DataGridViewプログラミング概要
DataSet(DataTable)との連携(データの更新処理やコンボボックス処理)
プログラムによるデータの追加、操作の補助機能などより高度な機能を実現するためには、プログラミングは欠かせません。
注意事項
DataGridViewのセルを操作する場合、一般的にindex値(0からの要素番号)を用いますがこの操作は危険(リスク)を伴います。
列の並びが変わった場合、プログラム側も意識しなければならなくなり非常に複雑になってしまいます。また、将来項目が追加されたり削除されるなどが予想される場合はなおさらです。
並びが変わっても柔軟に対応できる方法は「列名」を用いたプログラミングです。列名が変わらない場合、並びが変わっても、追加や削除の列があっても従来の列に対してプログラムを変更する必要はありません。
DataGridViewをプログラムで動的生成する方法
生成した後の使い方は共通ですので、動的にDataGridViewを生成するコーディングを考えてみましょう。
一番簡単な方法は、Visual Studioのデザイナーを利用してコードを作成する方法です。.Designer.csから、必要なコードを抜粋してくれば簡単です。
逆引きDataGridViewプログラミング
行を追加する
int rowIndex = dataGridView1.Rows.Add(); // 追加した行インデックスを返す
指定「列」または「行」の表示/非常時
// 列の表示/非表示 dataGridView1.Columns[0].Visible = true / false; dataGridView1.Columns[”列名”].Visible = true / false; // 行の表示/非表示 dataGridView1.Rows[0].Visible = true / false;
指定「列」または「行」を削除にする
// 指定列削除 dataGridView1.Columns.Remove("列名"); dataGridView1.Columns.RemoveAt(0); // 指定行削除 dataGridView1.Rows.RemoveAt(0);
選択されている行を削除する
foreach (DataGridViewRow row in dataGridView1.SelectedRows) { // 新規(追加)行は削除しない if (!row.IsNewRow) { dataGridView1.Rows.Remove(row); } }
全行を削除する
// (注意:カラム幅の自動モードで例外が発生する可能性有り) dataGridView1.Rows.Clear();
全ての行を削除する
for (int index = dataGridView1.Rows.Count - 1; index < 0; index++) { // // 新規(追加)行は削除しない if (!dataGridView1.Rows[index].IsNewRow) { dataGridView1.Rows.RemoveAt(index); } }
カレントセルを取得する
String value = dataGridView1.CurrentCell.Value;
カレントセルを変更する
dataGridView1.CurrentCell = value;
選択を無効にする
dataGridView1.CurrentCell = null;
// または
dataGridView1.ClearSelection();
選択セルを選択状態にする
dataGridView1.Selected = true;
指定列(Column)をソートする
dataGridView1.Sort(DataGridView1.Columns(0), ListSortDirection.Ascending)
指定列を入力禁止にする
dataGridView1.Columns[columnIndex].ReadOnly = true; // または dataGridView1.Columns["列名"].ReadOnly = true;
指定行を入力禁止にする
dataGridView1.Rows[rowIndex].ReadOnly = true;
指定セルの背景色を変更する
dataGridView1.Rows[rowIndex].Cells["列名"].Style.BackColor = Color.色;
表示する先頭行(スクロール時の先頭行)を変更する
dataGridView1.FirstDisplayedScrollingRowIndex = N;
スクロール範囲でセルが表示されているか確認する
if (dataGridView1.Rows[rowIndex].Cells("列名").Displayed == true) {…}
CSV形式テキストファイルをDataGridViewへセットする(データの初期設定)
public void DataLoad(String path) { // DGVの全行を削除する dataGridView1.Rows.Clear(); int ColumnCount = dataGridView1.ColumnCount; using (StreamReader sr = new StreamReader(path, System.Text.Encoding.GetEncoding("SHIFT-JIS"))) { String LineData; while (sr.EndOfStream == false) { LineData = sr.ReadLine(); String[] Items = LineData.Split(','); //if (ColumnCount != Items.GetLength(0)) 必要に応じてデータの検証を行う // continue; int rowIndex = dataGridView1.Rows.Add(); for (int celIndex = 0; celIndex < ColumnCount; celIndex++) { dataGridView1.Rows[rowIndex].Cells[celIndex].Value = Items[celIndex].Trim(); } } } }
注意)DataSourceをバインドしている場合、DataGridViewの行を直接追加(Add)することはできない。
DataGridViewの内容をテキストファイルへCSV出力する(保存)
public void DataSave(String path) { int RowsCount = dataGridView1.Rows.Count; int ColumnCount = dataGridView1.ColumnCount; using (StreamWriter sw = new StreamWriter(path, false, System.Text.Encoding.GetEncoding("SHIFT-JIS"))) { for (int rowIndex = 0; rowIndex <= RowsCount; rowIndex++) { String LineData = ""; for (int celIndex = 0; celIndex < ColumnCount; celIndex++) { LineData += dataGridView1.Rows[rowIndex].Cells[celIndex].Value.ToString(); if (celIndex < ColumnCount - 1) LineData += ","; } sw.WriteLine(LineData + "\n"); } } }
DataGridViewComboBoxColumnリストの動的変更
各行毎に異なるアイテムリストを作る
列をDataGridViewComboBoxColumnに設定すると、自動的に DataGridViewComboBoxCell 型になります。
DataSource プロパティや Items プロパティを設定してやればセル独自のリストを持てます。
DataGridViewのCellBeginEditイベントでDataGridViewComboBoxCellのDataSource を設定すれば実現できます。
CellBeginEditイベントのタイミングで実装すれば、同一行のある列の値に対応したリストを表示する事も可能になります。