C#:Winフォーム:データグリッドビュー
Tips
参考
■データグリッドビュー
表示するテキストの配置方法
DataGridViewで表示するテキストの配置方法を変更する - .NET Tips (VB.NET,C#...)"
【表】
【表】クリア
//******************************************** /// <summary> /// [DGV] クリア /// </summary> //******************************************** private void mDgv_Clear() { dgv.DataSource = null; dgv.Rows.Clear(); dgv.Columns.Clear(); }
【表】フォームに合わせてサイズを変更
メモ:DataGridViewの大きさをフォームにあわせて自動で変更する - 記録として残しておきたいブログ"
this.dgv.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
【データテーブル】Dgv → DataTable
データグリッドビュー → データテーブル
DataGridViewをDataTableに変換 C# | 文系出身のSEですが、何か
/// <summary> /// /// </summary> /// <param name="fm"></param> /// <returns></returns> public static DataTable m02_Select(frmDataTable fm) { DataTable dt = new DataTable("Table"); // ヘッダ for (int c = 0; c < fm.dgv.ColumnCount; c++) { dt.Columns.Add(fm.dgv.Columns[c].HeaderText); } // データ for (int r = 0; r < fm.dgv.Rows.Count - 1; r++) { DataRow dr = dt.NewRow(); for (int col = 0; col < fm.dgv.Columns.Count; col++) { dr[col] = fm.dgv.Rows[r].Cells[col].Value; } dt.Rows.Add(dr); } // Selectメソッドを使ってデータを抽出 DataRow[] dRows = dt.Select("教科 = '国語'"); foreach (var row in dRows) { Console.WriteLine("点数:{0}点、氏名:{1}、クラス:{2}", row[1], row[2], row[3]); } /**/ return dt; }
/// <summary> /// /// </summary> /// <param name="fm"></param> /// <returns></returns> public static DataTable m03_LINQ(frmDataTable fm) { DataTable dt = new DataTable("Table"); // ヘッダ for (int c = 0; c < fm.dgv.ColumnCount; c++) { dt.Columns.Add(fm.dgv.Columns[c].HeaderText); } // データ for (int r = 0; r < fm.dgv.Rows.Count - 1; r++) { DataRow dr = dt.NewRow(); for (int col = 0; col < fm.dgv.Columns.Count; col++) { dr[col] = fm.dgv.Rows[r].Cells[col].Value; } dt.Rows.Add(dr); } // LINQを使ってデータを抽出 DataRow[] dRows = dt.AsEnumerable().Where(row => row.Field<string>("教科") == "国語").ToArray(); foreach (var row in dRows) { Console.WriteLine("点数:{0}点、氏名:{1}、クラス:{2}", row[1], row[2], row[3]); } /**/ return dt; }
【ヘッダ】
【ヘッダ】ヘッダーセルを取得
//***************************************************** /// <summary> /// [DGV]ヘッダセルを取得 /// </summary> //***************************************************** private void mDgv_GetHdrrCellVal() { List<string> sl = new List<string>(); //========================= // 左上 //========================= Console.WriteLine(dgv.TopLeftHeaderCell.Value.ToString()); //========================= // 列ヘッダリスト //========================= for (int i = 0; i < dgv.Columns.Count; i++) { sl.Add(dgv.Columns[i].HeaderCell.Value.ToString()); } sl.ForEach(c => Console.WriteLine(c)); //========================= // 行ヘッダリスト //========================= for (int i = 0; i < dgv.RowCount; i++) { string s = (dgv.Rows[i].HeaderCell.Value != null) ? dgv.Rows[i].HeaderCell.Value.ToString() : ""; sl.Add(s); } sl.ForEach(c => Console.WriteLine(c)); }
DataGridViewのヘッダーセルを取得する - .NET Tips (VB.NET,C#...)"
【列・行】
【列】ソート不可
// Sort禁止 for (int c = 0; c < dgv.Columns.Count; c++) dgv.Columns[c].SortMode = DataGridViewColumnSortMode.NotSortable;
DataGridViewの行をユーザーが並び替えできないようにする - .NET Tips (VB.NET,C#...)"
【行】 最下位行(新規行)非表示
// 行の自動追加禁止 dgv.AllowUserToAddRows = false;
DataGridViewの一番下の新しい行(新規行)を非表示にして、ユーザーが新しい行を追加できないようにする - .NET Tips (VB.NET,C#...)"
【行・列】列の幅や行の高さ調整
//幅 dgv.AutoResizeRowHeadersWidth(DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders); // 行ヘッダ dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells; // 列幅
DataGridViewの列の幅や行の高さを自動的に調整
DataGridViewの列の幅や行の高さを自動的に調整する - .NET Tips (VB.NET,C#...)
自動調整にするとユーザが変更できない
自動調整→自動調整解除
カラム幅の自動調整と任意の調整両方を有効にする"
【行】複数行選択できないようにする
DataGridで複数行選択できないようにし、セルがアクティブにならならず、行全体が選択されるようにする - .NET Tips (VB.NET,C#...)"
【行】行削除禁止
dgv.AllowUserToDeleteRows = false;
【列】指定行の最終列No
//******************************************************************** /// <summary> /// [DGV]指定行の最終列No /// </summary> //******************************************************************** private void mDgv_GetLastColAtRowNo() { // 【C# DataGridView】列数、行数を取得する Console.WriteLine(dgv.Columns.Count); Console.WriteLine(dgv.Rows.Count); // int iRowNo = dgv.Rows.Count - 1; int iLastColNo = -1; if ((iRowNo < dgv.Rows.Count - 1) && (dgv.Columns.Count > 0)) { for (int col = dgv.Columns.Count - 1; col >= 0; col--) { if (dgv[col, iRowNo].Value.ToString() != string.Empty) { iLastColNo = col; break; } } } MessageBox.Show(string.Format("{0}", iLastColNo)); }
【列】指定行の先頭列No
//******************************************************************** /// <summary> /// [DGV]指定行の先頭列No /// </summary> //******************************************************************** private void mDgv_GetStartColAttRowNo() { // 【C# DataGridView】列数、行数を取得する Console.WriteLine(dgv.Columns.Count); Console.WriteLine(dgv.Rows.Count); // int iRowNo = 0; int iStartColNo = -1; if ((iRowNo < dgv.Rows.Count - 1) && (dgv.Columns.Count > 0)) { for (int col = 0; col < dgv.Columns.Count; col++) { if (dgv[col, iRowNo].Value.ToString() != string.Empty) { iStartColNo = col; break; } } } MessageBox.Show(string.Format("{0}", iStartColNo)); }
【行】文字数制限
// 文字数制限 for (int c = 0; c < dgv.Columns.Count; c++) { ((DataGridViewTextBoxColumn)dgv.Columns[c]).MaxInputLength = 1; }
【列・行】幅調整
//ヘッダー&セルの内容に合わせて列幅自動調整 dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; //ヘッダーを除く全てのセルに合わせて列幅自動調整 dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader; //ヘッダーに合わせ列幅自動調整 dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.ColumnHeader; //表示しているヘッダー&セルの内容に合わせて列幅自動調整 dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells; //表示しているセルの内容に合わせて列幅自動調整 dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCellsExceptHeader; //DataGridViewの表示幅に合わせて列幅自動調整 dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; //列幅調整を行わない dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None
【列・行・セル】スクロール
//********************************************* /// <summary> /// 【列・行・セル】スクロール /// </summary> //********************************************* private void mDgv_SetFirstDispScrollIndex() { dgv.FirstDisplayedScrollingRowIndex = 0; // 表示される最初の行 dgv.FirstDisplayedScrollingColumnIndex = 0; // 表示される最初の列 dgv.FirstDisplayedCell = dgv[1,1]; // 表示される最初のセル }
【行】1行おきに色付け
DataGridViewコントロールで1行おきに色付けするには?[2.0のみ、C#、VB]
【セル】
【セル】選択している値の取得
DataGridViewで選択されている列、行、セルを取得する、または列、行、セルを選択する - .NET Tips (VB.NET,C#...)"
【セル】選択時、編集状態にする
//************************************************************ /// <summary> /// セル選択時、編集状態 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> //************************************************************ private void dgv_CellClick(object sender, DataGridViewCellEventArgs e) { dgv.BeginEdit(true); }
【セル】編集値によって背景を変更する
//************************************************************ /// <summary> /// 【セル】編集修了、背景設定 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> //************************************************************ private void dgv_CellEndEdit(object sender, DataGridViewCellEventArgs e) { DataGridViewCell dgvc = dgv[e.ColumnIndex, e.RowIndex]; if (dgvc.Value.ToString() != string.Empty) dgvc.Style.BackColor = Color.FromArgb(255, 255, 255); else dgvc.Style.BackColor = Color.FromArgb(169, 169, 169); }
【セル】セル編集中のキーイベントを補足する(EditingControlShowingイベント)
DataGridViewのキーイベント(KeyDown、KeyUp、KeyPress、PreviewKeyDown)は、セルが編集中の場合は、発生しません。
DataGridViewでセルが編集中の時にキーイベントを捕捉する - .NET Tips (VB.NET,C#...)
//****************************************************** /// <summary> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> //****************************************************** private void dgv_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { //表示されているコントロールがDataGridViewTextBoxEditingControlか調べる if (e.Control is DataGridViewTextBoxEditingControl) { DataGridView dgv = (DataGridView)sender; //編集のために表示されているコントロールを取得 var tb =(DataGridViewTextBoxEditingControl)e.Control; //イベントハンドラを削除 tb.KeyPress -=new KeyPressEventHandler(dgv_KeyPress); //該当する列か調べる if (dgv.CurrentCell.OwningColumn.Name == "Column1") { //KeyPressイベントハンドラを追加 tb.KeyPress +=new KeyPressEventHandler(dgv_KeyPress); } } }
【セル】セルに正しくない値を入力した時に発生するエラーを捕捉(DataErrorイベント)
//****************************************************** /// <summary> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> //****************************************************** private void dgv_DataError(object sender, DataGridViewDataErrorEventArgs e) { if (e.Exception != null) { MessageBox.Show(this, string.Format("({0}, {1}) のセルでエラーが発生しました。\n\n説明: {2}", e.ColumnIndex, e.RowIndex, e.Exception.Message), "エラーが発生しました", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
ユーザーがDataGridViewのセルに正しくない値を入力した時に発生するエラーを捕捉する - .NET Tips (VB.NET,C#...)
大文字
CellFormattingイベントは、セルを表示する時(または、表示する文字列を取得する時)に発生
//********************************************************************* /// <summary> /// 大文字 /// セルを表示する時(または、表示する文字列を取得する時)に発生 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> //********************************************************************* private void dgv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { if (e.Value != null) { e.Value = e.Value.ToString().ToUpper(); } }
DataGridViewのセルの値によってセルスタイルを変更する - .NET Tips (VB.NET,C#...)
【C# DataGridView】セルに入力した文字列を大文字に変換する | ITLAB51.COM
フォント
GridName.DefaultCellStyle.Font = new Font("Arial",15.00F,FontStyle.Bold);
データグリッドビューでセルの背景色やフォント色を変更
[C#][VB.NET]データグリッドビューのヘッダを改行しない方法
データグリッドビューのチェックボックス行の背景設定
/// <summary> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Form1_Load(object sender, EventArgs e) { // カラム数を指定 dgv.ColumnCount = 5; dgv.Columns.Insert(0, (new DataGridViewCheckBoxColumn())); // カラム名を指定 dgv.Columns[0].HeaderText = "chk"; dgv.Columns[1].HeaderText = "教科"; dgv.Columns[2].HeaderText = "点数"; dgv.Columns[3].HeaderText = "氏名"; dgv.Columns[4].HeaderText = "クラス名"; // データを追加 dgv.Rows.Add(false, "国語", 90, "田中 一郎", "A"); dgv.Rows.Add(false, "数学", 50, "鈴木 二郎", "A"); dgv.Rows.Add(false, "英語", 90, "佐藤 三郎", "B"); } /// <summary> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) { int iChkCol = 0; if (dgv.CurrentCellAddress.X == iChkCol && dgv.IsCurrentCellDirty) { // --- Commit! dgv.CommitEdit(DataGridViewDataErrorContexts.Commit); if (dgv[iChkCol, dgv.CurrentCellAddress.Y].Value.ToString() == "True") { this.dgv.Rows[dgv.CurrentCellAddress.Y].DefaultCellStyle.BackColor = Color.Pink; //for (int i = 0; i < dataGridView1.Columns.Count; i++) //{ // dataGridView1[i, dataGridView1.CurrentCellAddress.Y].Style.BackColor = Color.Red; //} //dataGridView1["Column3", dataGridView1.CurrentCellAddress.Y].Value = "購入"; } else { this.dgv.Rows[dgv.CurrentCellAddress.Y].DefaultCellStyle.BackColor = Color.LightBlue; //for (int i = 0; i < dataGridView1.Columns.Count; i++) //{ // dataGridView1[i, dataGridView1.CurrentCellAddress.Y].Style.BackColor = Color.White; //} //dataGridView1["Column3", dataGridView1.CurrentCellAddress.Y].Value = null; } } }
C#でDataGridViewに配置したチェックボックスの状態取得 – 素直研究所の開発日誌
【その他】
表示例01
//******************************************************************** /// <summary> /// 表示例01 /// </summary> //******************************************************************** private void mDgv_SetViewSet01(int iColMaxLength) { // 読取専用 //dgv.ReadOnly = true; //幅 dgv.AutoResizeRowHeadersWidth(DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders); // 行ヘッダ dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells; // 列幅 // 文字位置 dgv.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; dgv.RowHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; dgv.RowsDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; //============================== // 行 //============================== // 行の自動追加禁止 dgv.AllowUserToAddRows = false; // 行削除禁止 dgv.AllowUserToDeleteRows = false; // Sort禁止・文字数制限 for (int c = 0; c < dgv.Columns.Count; c++) { dgv.Columns[c].SortMode = DataGridViewColumnSortMode.NotSortable; ((DataGridViewTextBoxColumn)dgv.Columns[c]).MaxInputLength = iColMaxLength; } // 幅を維持して変更可能 dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None; dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; foreach (DataGridViewColumn item in dgv.Columns) item.Width = item.Width; dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None; // 背景色 for (int irow = 0; irow < dgv.Rows.Count; irow++) { for (int iCol = 0; iCol < dgv.Columns.Count; iCol++) { DataGridViewCell dgvc = dgv[iCol, irow]; if (dgvc.Value.ToString() != string.Empty) dgvc.Style.BackColor = Color.FromArgb(255, 255, 255); else dgvc.Style.BackColor = Color.FromArgb(169, 169, 169); } } }
ASCII文字データテーブル
//************************************************** /// <summary> /// ASCII文字 /// </summary> /// <returns></returns> //************************************************** public static DataTable dtASCII() { // ASCII Char List<char> cs = new List<char>(); for (int i = 0; i < Convert.ToInt32("80",16); i++) { cs.Add((char)i); } // 文字列を指定文字数で分割した配列 var sArr =myDgv.clsString.mGet_StringToArrayAtLen2(string.Join("", cs),16); // データテーブル var dtAscii = new DataTable("TB_ASCII_CHAR"); // 列定義 for (int i = 0; i < 16; i++) { DataColumn dc = new DataColumn(); dc.ColumnName = (i).ToString("X2"); dc.DataType = Type.GetType("System.String"); dc.MaxLength = 1; dtAscii.Columns.Add(dc); } // データBody foreach (var item in sArr) { char[] ca = item.ToCharArray(); DataRow dr = dtAscii.NewRow(); for (int i = 0; i < ca.Length; i++) { dr[dtAscii.Columns[i]] = ca[i]; } dtAscii.Rows.Add(dr); } return dtAscii; }
//******************************************************** /// <summary> /// 文字列を指定文字数で分割した配列 /// </summary> /// <param name="sStr"></param> /// <param name="iCnt"></param> /// <returns></returns> //******************************************************** public static string[] mGet_StringToArrayAtLen2(string sStr, int iCnt) { var result = new List<string>(); int div = Math.DivRem(sStr.Length, iCnt, out int rem); for (int i = 0; i <= div; i++) { int sStartChar = iCnt * i; if (sStr.Length <= sStartChar) { break; } if (i== div && rem> 0) { result.Add(sStr.Substring(sStartChar)); } else { result.Add(sStr.Substring(sStartChar, iCnt)); } } return result.ToArray(); }
ASCII→HEX
//********************************************************** /// <summary> /// ASCII→HEX /// </summary> /// <param name="sender"></param> /// <param name="e"></param> //********************************************************** private void cmd_AsciiToHex_Click(object sender, EventArgs e) { var dt = mDgv_GetDgvToDt_AsciiToHex(); // DGVデータ取得 this.mDgv_Clear(); // クリア this.Refresh(); dgv.DataSource = dt; // 表示(DataSource) dgv.TopLeftHeaderCell.Value = "ASCII"; // 表示:ヘッダ左上 for (int i = 0; i < dgv.RowCount; i++) // 表示:行ヘッダ dgv.Rows[i].HeaderCell.Value = (16 * i).ToString("X2"); mDgv_SetViewSet01(); // 表示 }
//**************************************************************** /// <summary> /// ASCII Dgv → DataTable /// </summary> //**************************************************************** private DataTable mDgv_GetDgvToDt_AsciiToHex() { var dtHex = new DataTable("TB_ASCII_HEX"); // カラム定義 for (int col = 0; col < dgv.Columns.Count; col++) { DataColumn dc = new DataColumn(); dc.ColumnName = dgv.Columns[col].Name; dc.MaxLength = 2; dtHex.Columns.Add(dc); } // データBody for (int row = 0; row < dgv.Rows.Count; row++) { DataRow dr = dtHex.NewRow(); for (int col = 0; col < dgv.Columns.Count; col++) { if (dgv[col, row].Value.ToString() != "") { char cData = Convert.ToChar(dgv[col, row].Value); dr[col] = Convert.ToInt32(cData).ToString("X2"); } } dtHex.Rows.Add(dr); } return dtHex; }