none
DataGridViewの全セルにスクロールバーを表示したい RRS feed

  • 質問

  • VS.Net2005 C#

    DataGridView でDataGridViewTextBoxColumnを複数行表示(折り返し)で使用していますが、

    テキストに長文を設定するため、DataGridViewの高さを超過します。

    この際、DataGridViewの仕様?でスクロール単位が行であるため、超過部分の表示がされないままに、

    次の行へスクロール位置が飛んでしまい困っています。

    解決方法として、該当セルにスクロールバーを表示するか、DataGridViewのスクロールを

    行単位ではなくピクセル単位でと考えましたが、後者は難しそうなので、前者を軸に検討中です。

     

    いずれかの方法で構いませんが、実現方法をご存知でしたら、ご教示頂けますと助かります。

     

    尚、DataGridViewの主な設定は、以下の通りです。

    ・ユーザの行追加・削除は不可

    ・ユーザの列・行幅の変更は不可

    ・全て読み取り専用

    ・行・列ヘッダは非表示

     

    お粗末な日本語で恐縮ですが、宜しくお願い致します。

    2008年11月11日 9:35

回答

  • セルのEditingControlを表示させて、Readonlyやスクロールバーを設定してみる。

     

    Code Snippet

    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();

                DataGridView dgv = new DataGridView();
                dgv.Dock= DockStyle.Fill;
                this.Controls.Add(dgv);

                DataGridViewTextBoxColumn dgvcolumn = new DataGridViewTextBoxColumn();
                dgvcolumn.CellTemplate = new DGVScrollableMultiLineCell();
                dgvcolumn.DefaultCellStyle.WrapMode = DataGridViewTriState.True ;
                dgvcolumn.DataPropertyName = "Column1";
                dgv.Columns.Add(dgvcolumn);

                dgv.Columns.Add(new DataGridViewTextBoxColumn());

                DataTable dt = new DataTable();
                DataColumn col1 = new DataColumn("Column1" , typeof(string));
                dt.Columns.Add(col1);

                System.Text.StringBuilder sb = new StringBuilder();
                for (int i = 1; i <= 100; i++)
                {
                    sb.Append(i);
                    sb.AppendLine();
                }
                dt.Rows.Add(sb.ToString());
                dgv.DataSource = dt;
                dgv.CellClick += delegate(object sender , DataGridViewCellEventArgs e)
                                { if (e.ColumnIndex == 1) ((DataGridView)sender).BeginEdit(false); };
            }
        }

     

        public class DGVScrollableMultiLineCell : System.Windows.Forms.DataGridViewTextBoxCell
        {
            public override void DetachEditingControl()
            {
                DataGridViewTextBoxEditingControl control
                    = (DataGridViewTextBoxEditingControl)this.DataGridView.EditingControl;
                control.Multiline = false;
                control.ReadOnly = false;
                control.ScrollBars = ScrollBars.None;

                base.DetachEditingControl();
            }
            public override void PositionEditingControl(bool setLocation , bool setSize , Rectangle cellBounds
                , Rectangle cellClip , DataGridViewCellStyle cellStyle , bool singleVerticalBorderAdded
                , bool singleHorizontalBorderAdded , bool isFirstDisplayedColumn , bool isFirstDisplayedRow)
            {
                base.PositionEditingControl(setLocation , setSize , cellBounds , cellClip , cellStyle
                    , singleVerticalBorderAdded , singleHorizontalBorderAdded , isFirstDisplayedColumn , isFirstDisplayedRow);

                DataGridViewTextBoxEditingControl control
                    = (DataGridViewTextBoxEditingControl)this.DataGridView.EditingControl;
                control.Size = cellClip.Size;
                control.Location = new Point(0 , 0);
                control.Multiline = true;
                control.ReadOnly = true;
                control.ScrollBars = ScrollBars.Vertical;
             }
        }
    }

     

     

    2008年11月14日 16:30

すべての返信

  • こんにちは!(^^)!ふ~です。

     

    >いずれかの方法で構いませんが、実現方法をご存知でしたら、ご教示頂けますと助かります。

    文字列を80文字で改行するなど、一行の長さを制限し、制限を超えた場合は、改行を付加、2行目にすると言う基本的な処理では駄目でしょうか?

     

    2008年11月14日 4:41
  • セルのEditingControlを表示させて、Readonlyやスクロールバーを設定してみる。

     

    Code Snippet

    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();

                DataGridView dgv = new DataGridView();
                dgv.Dock= DockStyle.Fill;
                this.Controls.Add(dgv);

                DataGridViewTextBoxColumn dgvcolumn = new DataGridViewTextBoxColumn();
                dgvcolumn.CellTemplate = new DGVScrollableMultiLineCell();
                dgvcolumn.DefaultCellStyle.WrapMode = DataGridViewTriState.True ;
                dgvcolumn.DataPropertyName = "Column1";
                dgv.Columns.Add(dgvcolumn);

                dgv.Columns.Add(new DataGridViewTextBoxColumn());

                DataTable dt = new DataTable();
                DataColumn col1 = new DataColumn("Column1" , typeof(string));
                dt.Columns.Add(col1);

                System.Text.StringBuilder sb = new StringBuilder();
                for (int i = 1; i <= 100; i++)
                {
                    sb.Append(i);
                    sb.AppendLine();
                }
                dt.Rows.Add(sb.ToString());
                dgv.DataSource = dt;
                dgv.CellClick += delegate(object sender , DataGridViewCellEventArgs e)
                                { if (e.ColumnIndex == 1) ((DataGridView)sender).BeginEdit(false); };
            }
        }

     

        public class DGVScrollableMultiLineCell : System.Windows.Forms.DataGridViewTextBoxCell
        {
            public override void DetachEditingControl()
            {
                DataGridViewTextBoxEditingControl control
                    = (DataGridViewTextBoxEditingControl)this.DataGridView.EditingControl;
                control.Multiline = false;
                control.ReadOnly = false;
                control.ScrollBars = ScrollBars.None;

                base.DetachEditingControl();
            }
            public override void PositionEditingControl(bool setLocation , bool setSize , Rectangle cellBounds
                , Rectangle cellClip , DataGridViewCellStyle cellStyle , bool singleVerticalBorderAdded
                , bool singleHorizontalBorderAdded , bool isFirstDisplayedColumn , bool isFirstDisplayedRow)
            {
                base.PositionEditingControl(setLocation , setSize , cellBounds , cellClip , cellStyle
                    , singleVerticalBorderAdded , singleHorizontalBorderAdded , isFirstDisplayedColumn , isFirstDisplayedRow);

                DataGridViewTextBoxEditingControl control
                    = (DataGridViewTextBoxEditingControl)this.DataGridView.EditingControl;
                control.Size = cellClip.Size;
                control.Location = new Point(0 , 0);
                control.Multiline = true;
                control.ReadOnly = true;
                control.ScrollBars = ScrollBars.Vertical;
             }
        }
    }

     

     

    2008年11月14日 16:30
  • こんにちは。中川俊輔 です。

     

    !(^^)!ふ~さん、gekkaさん、回答ありがとうございます。

     

    まずまずさん、初めまして!フォーラムのご利用ありがとうございます。

    その後いかがでしょうか?

    有用な情報と思われたため、gekkaさんの回答へ回答済みチェックをつけさせていただきました。

    追加の質問等ありましたら、ぜひ投稿してみてください。

     

    今後ともフォーラムをよろしくお願いします。

    それでは!

    2008年11月28日 9:20