既定では右端の列がDataGridViewの右端に接しているとき、その列の幅を増加させることはできません。これを解決する方法を考えます。
問題の列が右端にならないように、さらに右に列を追加します。DataGridViewの右端の列の幅を操作させるには?
// ダミーの列を追加する { DataGridViewColumn column = new DataGridViewTextBoxColumn(); column.Width = 10; column.ReadOnly = true; // 書き換え禁止 column.Resizable = DataGridViewTriState.False; // リサイズ禁止 column.SortMode = DataGridViewColumnSortMode.NotSortable; // ソート禁止 Columns.Add(column); }
protected override void OnCellPainting(DataGridViewCellPaintingEventArgs e)
{
base.OnCellPainting(e);
// 右端の列ならば、セルを描画しない
if (e.ColumnIndex == ColumnCount - 1)
{
// DataGridViewの背景色で塗りつぶす
Brush brush = new SolidBrush(BackgroundColor);
e.Graphics.FillRectangle(brush, e.CellBounds);
e.Handled = true;
}
}
リサイズされるときにクリッピング領域を拡大し、マウスボタンが離された位置を列の幅としてコードで指定します。c# - DataGridView rightmost column user increase size not working - Stack Overflow
private enum DataGridViewHitTestTypeInternal
{
None,
Cell,
ColumnHeader,
RowHeader,
ColumnResizeLeft,
ColumnResizeRight,
}
private int resizeColumnIndex = -1;
protected override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown(e);
HitTestInfo hitTestInfo = HitTest(e.X, e.Y);
if (hitTestInfo.Type == DataGridViewHitTestType.ColumnHeader)
{
// クリックされた位置を詳細に特定するため、リフレクションによりInternalな情報を取得する
System.Reflection.FieldInfo fieldInfo = typeof(HitTestInfo).GetField("typeInternal", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
DataGridViewHitTestTypeInternal hitTestType = (DataGridViewHitTestTypeInternal)fieldInfo.GetValue(hitTestInfo);
// クリックされた位置が区分線上ならば、リサイズされると見なす
if (hitTestType == DataGridViewHitTestTypeInternal.ColumnResizeLeft
|| hitTestType == DataGridViewHitTestTypeInternal.ColumnResizeRight)
{
this.resizeColumnIndex = hitTestInfo.ColumnIndex - (hitTestType == DataGridViewHitTestTypeInternal.ColumnResizeLeft ? 1 : 0);
Rectangle clip = Cursor.Clip;
Rectangle screenBounds = Screen.GetBounds(this);
// クリッピング領域がコントロール内に制限されないように、スクリーンの右端まで拡大する
clip.Width = screenBounds.Width - clip.Left;
Cursor.Clip = clip;
return;
}
}
this.resizeColumnIndex = -1;
}
protected override void OnMouseUp(MouseEventArgs e)
{
base.OnMouseUp(e);
// コントロールの右端を超えた大きさを指定されたならば、コードで列の幅を指定する
if (this.resizeColumnIndex != -1 && Right < e.X)
{
Rectangle columnRectangle = GetColumnDisplayRectangle(this.resizeColumnIndex, false);
Columns[this.resizeColumnIndex].Width = e.X - columnRectangle.Left;
}
}