トップ回答者
DataGridViewの全セルにスクロールバーを表示したい

質問
-
VS.Net2005 C#
DataGridView でDataGridViewTextBoxColumnを複数行表示(折り返し)で使用していますが、
テキストに長文を設定するため、DataGridViewの高さを超過します。
この際、DataGridViewの仕様?でスクロール単位が行であるため、超過部分の表示がされないままに、
次の行へスクロール位置が飛んでしまい困っています。
解決方法として、該当セルにスクロールバーを表示するか、DataGridViewのスクロールを
行単位ではなくピクセル単位でと考えましたが、後者は難しそうなので、前者を軸に検討中です。
いずれかの方法で構いませんが、実現方法をご存知でしたら、ご教示頂けますと助かります。
尚、DataGridViewの主な設定は、以下の通りです。
・ユーザの行追加・削除は不可
・ユーザの列・行幅の変更は不可
・全て読み取り専用
・行・列ヘッダは非表示
お粗末な日本語で恐縮ですが、宜しくお願い致します。
回答
-
セルのEditingControlを表示させて、Readonlyやスクロールバーを設定してみる。
Code Snippetnamespace 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;
}
}
}
すべての返信
-
セルのEditingControlを表示させて、Readonlyやスクロールバーを設定してみる。
Code Snippetnamespace 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;
}
}
}