プログラミングのメモ

プログラミングの学び直し備忘録

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

raishin.xyz

【列・行・セル】スクロール

        //*********************************************
        /// <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); 

データグリッドビューでセルの背景色やフォント色を変更

www.curict.com

[C#][VB.NET]データグリッドビューのヘッダを改行しない方法

www.curict.com

データグリッドビューのチェックボックス行の背景設定

        /// <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;
        }