none
DataGridViewCheckBoxColumnにテキストも表示 RRS feed

  • 質問

  • いつもお世話になっております。
    環境:WinXP、C#2.0、VS2005
    DataGridViewCheckBoxColumnを使えばチェックボックスを
    表示できることがわかったのですが、
    そのチェックボックスの横にテキストも表示したいのです。
    (普通のチェックボックスのように)
    簡単に出来るものでしょうか。
    宜しくお願い致します。

    2009年3月10日 10:50

回答

  • 一般にDataGridViewはひとつのカラムに値をひとつ設定できるように作られています。
    チェックボックスの横にテキストも表示するとはひとつのカラムに値がふたついります。

    ReadOnly な DataGridViewTextBoxColumn を DataGridViewCheckBoxColumn の右側においてそれらしく見せることはできます。
    えムナウ@わんくま同盟 Microsoft MVP Visual Studio C# Since 2005/01-2009/12
    • 回答としてマーク Myon 2009年3月17日 8:47
    • 回答としてマークされていない Myon 2009年3月17日 8:47
    • 回答としてマーク sk7474 2009年3月19日 4:23
    • 回答としてマークされていない sk7474 2009年3月19日 4:57
    • 回答としてマーク Myon 2009年3月21日 17:39
    2009年3月10日 12:26
  • Myonさん の発言:

    簡単に出来るものでしょうか。

    残念ながら簡単にはできません。通常は列のタイトルで事足りるからでしょう。
    検索しただけですが、以下のページが参考になると思います。

    DataGridViewCheckBoxCellにラベルを表示する
    http://iyouneta.blog49.fc2.com/blog-entry-331.html
    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク Myon 2009年3月17日 8:47
    • 回答としてマークされていない Myon 2009年3月17日 8:47
    • 回答としてマーク sk7474 2009年3月19日 4:23
    • 回答としてマークされていない sk7474 2009年3月19日 4:57
    • 回答としてマーク Myon 2009年3月21日 17:39
    2009年3月11日 0:05
    モデレータ
  •  こんにちは!(^^)!ふ~です。

    DataGridView.RowPostPaint イベントハンドラー処理を使用しても、簡単にチェックボックスに文字列を表示できます。

    <ファイル名 Form1.cs >
    using System;  
    using System.Data;  
    using System.Drawing;  
    using System.Text;  
    using System.Windows.Forms;  
     
    namespace DataGreidViewCheckBoxLabel  
    {  
        public partial class Form1 : Form  
        {  
            public Form1()  
            {  
                InitializeComponent();  
                MakeTable();  
                dataGridView1.RowPostPaint += new DataGridViewRowPostPaintEventHandler(dataGridView1_RowPostPaint);  
            }  
     
            // DataGridView.RowPostPaint イベントハンドラー処理をする  
            void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)  
            {  
                DataGridView dgv = (DataGridView)sender;  
     
                DataGridViewColumn column1 = dataGridView1.Columns["No."];  
                DataGridViewColumn column2 = dataGridView1.Columns["名前"];  
                DataGridViewColumn column3 = dataGridView1.Columns["得点"];  
                DataGridViewColumn column4 = dataGridView1.Columns["チェックボックス"];  
     
                int startX = dgv.RowHeadersVisible ? dgv.RowHeadersWidth : 0;  
                //int startY = e.RowBounds.Top + e.RowBounds.Height - 1;  
     
                // 文字表示位置を調整する  
                int pX = startX + column1.Width + column2.Width + column3.Width + 20;   
                int pY = e.RowBounds.Y + 5;  
     
                //フォントオブジェクトを作成する  
                Font fnt = new Font("MS UI Gothic", 8);  
     
                //チェックボックスに表示する文字列を作成する  
                string strMes = string.Format( "チェック {0}", e.RowIndex );  
     
                //チェックボックスの位置に文字列を表示する  
                e.Graphics.DrawString( strMes, fnt, Brushes.Blue, pX, pY);  
     
                //フォントオブジェクトを開放する  
                fnt.Dispose();  
           }  
              
            /// <summary> 
            /// dataGridView1にテストデータを設定する  
            /// </summary> 
            private void MakeTable()  
            {  
                // Create a new DataTable.  
                DataTable table = new DataTable("testTable");  
                DataColumn column;  
                DataRow row;  
     
                // Create first column and add to the DataTable.  
                column = new DataColumn();  
                column.DataType = System.Type.GetType("System.Int32");  
                column.ColumnName = "No.";  
                column.AutoIncrement = true;  
                column.Caption = "ID";  
                column.ReadOnly = true;  
                column.Unique = true;  
     
                // Add the column to the DataColumnCollection.  
                table.Columns.Add(column);  
     
                // Create second column.  
                column = new DataColumn();  
                column.DataType = System.Type.GetType("System.String");  
                column.ColumnName = "名前";  
                column.AutoIncrement = false;  
                column.Caption = "Name";  
                column.ReadOnly = false;  
                column.Unique = false;  
                table.Columns.Add(column);  
     
                // Create third column.  
                column = new DataColumn();  
                column.DataType = System.Type.GetType("System.Int32");  
                column.ColumnName = "得点";  
                column.AutoIncrement = false;  
                column.Caption = "Score";  
                column.ReadOnly = false;  
                column.Unique = false;  
                table.Columns.Add(column);  
     
                dataGridView1.DataSource = table;  
     
                // チェックボックスの設定する  
                DataGridViewCheckBoxColumn CheckBoxColumn = new DataGridViewCheckBoxColumn();  
                CheckBoxColumn.Name = "チェックボックス";  
                CheckBoxColumn.HeaderText = "ヘッダーテキスト";  
                CheckBoxColumn.ThreeState = true;  
                CheckBoxColumn.CellTemplate.Style.BackColor = Color.Beige;  
                CheckBoxColumn.FlatStyle = FlatStyle.Standard;  
                CheckBoxColumn.AutoSizeMode = DataGridViewAutoSizeColumnMode.None;  
                dataGridView1.Columns.Add(CheckBoxColumn);  
     
                // チェックボックスを左に寄せる  
                dataGridView1.Columns[3].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;  
     
                // テーブルにデータを設定する  
                for (int i = 0; i <= 4; i++)  
                {  
                    row = table.NewRow();  
                    row["No."] = i;  
                    row["名前"] = "PoNiyo " + i;  
                    row["得点"] = 10;  
                    table.Rows.Add(row);  
                }  
                for (int i = 0; i <= 4; i++)  
                {  
                    row = table.NewRow();  
                    row["No."] = i + 5;  
                    row["名前"] = "PoNiyo " + i;  
                    row["得点"] = 20;  
                    table.Rows.Add(row);  
                }  
                for (int i = 0; i <= 4; i++)  
                {  
                    row = table.NewRow();  
                    row["No."] = i + 10;  
                    row["名前"] = "PoNiyo " + i;  
                    row["得点"] = 30;  
                    table.Rows.Add(row);  
                }  
            }  
        }  
    }  
     

    <作成方法>
    1.VS2005のWindowsアプリケーションのプロジェクトを作成する。
    2.フォームへDataGridViewコントロールを張り付ける。
    3.DataGridView.RowPostPaint イベントを追加する(.NET Framework version 2.0 で新しく追加されたもの)
    以上
    • 回答としてマーク Myon 2009年3月21日 17:39
    2009年3月20日 4:03
  •  えムナウ様、trapemiya様、ご回答ありがとうございました。
    DataGridViewCheckBoxCellのカスタマイズを含めまして再検討させていただきます。
    • 回答としてマーク Myon 2009年3月21日 17:39
    2009年3月11日 7:33
  •  
    trapemiya

    ご提示いただいたリンクのクラスを使用することにより
    万事解決いたしました。ありがとうございました。


    • 回答としてマーク Myon 2009年3月21日 17:39
    2009年3月17日 8:49
  • !(^^)!ふ~様

    ご投稿ありがとうございました。
     RowPostPaintというのは今まで使ったことがありませんでした。
    今後の参考にさせていただきます。

    • 回答としてマーク Myon 2009年3月21日 17:39
    2009年3月21日 17:39

すべての返信

  • 一般にDataGridViewはひとつのカラムに値をひとつ設定できるように作られています。
    チェックボックスの横にテキストも表示するとはひとつのカラムに値がふたついります。

    ReadOnly な DataGridViewTextBoxColumn を DataGridViewCheckBoxColumn の右側においてそれらしく見せることはできます。
    えムナウ@わんくま同盟 Microsoft MVP Visual Studio C# Since 2005/01-2009/12
    • 回答としてマーク Myon 2009年3月17日 8:47
    • 回答としてマークされていない Myon 2009年3月17日 8:47
    • 回答としてマーク sk7474 2009年3月19日 4:23
    • 回答としてマークされていない sk7474 2009年3月19日 4:57
    • 回答としてマーク Myon 2009年3月21日 17:39
    2009年3月10日 12:26
  • Myonさん の発言:

    簡単に出来るものでしょうか。

    残念ながら簡単にはできません。通常は列のタイトルで事足りるからでしょう。
    検索しただけですが、以下のページが参考になると思います。

    DataGridViewCheckBoxCellにラベルを表示する
    http://iyouneta.blog49.fc2.com/blog-entry-331.html
    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク Myon 2009年3月17日 8:47
    • 回答としてマークされていない Myon 2009年3月17日 8:47
    • 回答としてマーク sk7474 2009年3月19日 4:23
    • 回答としてマークされていない sk7474 2009年3月19日 4:57
    • 回答としてマーク Myon 2009年3月21日 17:39
    2009年3月11日 0:05
    モデレータ
  •  えムナウ様、trapemiya様、ご回答ありがとうございました。
    DataGridViewCheckBoxCellのカスタマイズを含めまして再検討させていただきます。
    • 回答としてマーク Myon 2009年3月21日 17:39
    2009年3月11日 7:33
  •  
    trapemiya

    ご提示いただいたリンクのクラスを使用することにより
    万事解決いたしました。ありがとうございました。


    • 回答としてマーク Myon 2009年3月21日 17:39
    2009年3月17日 8:49
  •  こんにちは!(^^)!ふ~です。

    DataGridView.RowPostPaint イベントハンドラー処理を使用しても、簡単にチェックボックスに文字列を表示できます。

    <ファイル名 Form1.cs >
    using System;  
    using System.Data;  
    using System.Drawing;  
    using System.Text;  
    using System.Windows.Forms;  
     
    namespace DataGreidViewCheckBoxLabel  
    {  
        public partial class Form1 : Form  
        {  
            public Form1()  
            {  
                InitializeComponent();  
                MakeTable();  
                dataGridView1.RowPostPaint += new DataGridViewRowPostPaintEventHandler(dataGridView1_RowPostPaint);  
            }  
     
            // DataGridView.RowPostPaint イベントハンドラー処理をする  
            void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)  
            {  
                DataGridView dgv = (DataGridView)sender;  
     
                DataGridViewColumn column1 = dataGridView1.Columns["No."];  
                DataGridViewColumn column2 = dataGridView1.Columns["名前"];  
                DataGridViewColumn column3 = dataGridView1.Columns["得点"];  
                DataGridViewColumn column4 = dataGridView1.Columns["チェックボックス"];  
     
                int startX = dgv.RowHeadersVisible ? dgv.RowHeadersWidth : 0;  
                //int startY = e.RowBounds.Top + e.RowBounds.Height - 1;  
     
                // 文字表示位置を調整する  
                int pX = startX + column1.Width + column2.Width + column3.Width + 20;   
                int pY = e.RowBounds.Y + 5;  
     
                //フォントオブジェクトを作成する  
                Font fnt = new Font("MS UI Gothic", 8);  
     
                //チェックボックスに表示する文字列を作成する  
                string strMes = string.Format( "チェック {0}", e.RowIndex );  
     
                //チェックボックスの位置に文字列を表示する  
                e.Graphics.DrawString( strMes, fnt, Brushes.Blue, pX, pY);  
     
                //フォントオブジェクトを開放する  
                fnt.Dispose();  
           }  
              
            /// <summary> 
            /// dataGridView1にテストデータを設定する  
            /// </summary> 
            private void MakeTable()  
            {  
                // Create a new DataTable.  
                DataTable table = new DataTable("testTable");  
                DataColumn column;  
                DataRow row;  
     
                // Create first column and add to the DataTable.  
                column = new DataColumn();  
                column.DataType = System.Type.GetType("System.Int32");  
                column.ColumnName = "No.";  
                column.AutoIncrement = true;  
                column.Caption = "ID";  
                column.ReadOnly = true;  
                column.Unique = true;  
     
                // Add the column to the DataColumnCollection.  
                table.Columns.Add(column);  
     
                // Create second column.  
                column = new DataColumn();  
                column.DataType = System.Type.GetType("System.String");  
                column.ColumnName = "名前";  
                column.AutoIncrement = false;  
                column.Caption = "Name";  
                column.ReadOnly = false;  
                column.Unique = false;  
                table.Columns.Add(column);  
     
                // Create third column.  
                column = new DataColumn();  
                column.DataType = System.Type.GetType("System.Int32");  
                column.ColumnName = "得点";  
                column.AutoIncrement = false;  
                column.Caption = "Score";  
                column.ReadOnly = false;  
                column.Unique = false;  
                table.Columns.Add(column);  
     
                dataGridView1.DataSource = table;  
     
                // チェックボックスの設定する  
                DataGridViewCheckBoxColumn CheckBoxColumn = new DataGridViewCheckBoxColumn();  
                CheckBoxColumn.Name = "チェックボックス";  
                CheckBoxColumn.HeaderText = "ヘッダーテキスト";  
                CheckBoxColumn.ThreeState = true;  
                CheckBoxColumn.CellTemplate.Style.BackColor = Color.Beige;  
                CheckBoxColumn.FlatStyle = FlatStyle.Standard;  
                CheckBoxColumn.AutoSizeMode = DataGridViewAutoSizeColumnMode.None;  
                dataGridView1.Columns.Add(CheckBoxColumn);  
     
                // チェックボックスを左に寄せる  
                dataGridView1.Columns[3].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;  
     
                // テーブルにデータを設定する  
                for (int i = 0; i <= 4; i++)  
                {  
                    row = table.NewRow();  
                    row["No."] = i;  
                    row["名前"] = "PoNiyo " + i;  
                    row["得点"] = 10;  
                    table.Rows.Add(row);  
                }  
                for (int i = 0; i <= 4; i++)  
                {  
                    row = table.NewRow();  
                    row["No."] = i + 5;  
                    row["名前"] = "PoNiyo " + i;  
                    row["得点"] = 20;  
                    table.Rows.Add(row);  
                }  
                for (int i = 0; i <= 4; i++)  
                {  
                    row = table.NewRow();  
                    row["No."] = i + 10;  
                    row["名前"] = "PoNiyo " + i;  
                    row["得点"] = 30;  
                    table.Rows.Add(row);  
                }  
            }  
        }  
    }  
     

    <作成方法>
    1.VS2005のWindowsアプリケーションのプロジェクトを作成する。
    2.フォームへDataGridViewコントロールを張り付ける。
    3.DataGridView.RowPostPaint イベントを追加する(.NET Framework version 2.0 で新しく追加されたもの)
    以上
    • 回答としてマーク Myon 2009年3月21日 17:39
    2009年3月20日 4:03
  • !(^^)!ふ~様

    ご投稿ありがとうございました。
     RowPostPaintというのは今まで使ったことがありませんでした。
    今後の参考にさせていただきます。

    • 回答としてマーク Myon 2009年3月21日 17:39
    2009年3月21日 17:39