2

I have a DataGridView with a TextColumn. Some of the cells can be a bit long to show in a DataGridView, so I truncate the text and add "..." to the text. I don't want to wrap the text to multiple lines.

I would like to let the user edit the text in the column. In the EditingControlShowing I currently set the editing TextBox' text to the full value of the text (otherwise only truncated value shows up). Everything fine so far.

How do I make the editing TextBox expand vertically beyond its cell (the cells are only one line high), to make it easier for the user to edit multi-line entries?

Jimmy
  • 5,131
  • 9
  • 55
  • 81

1 Answers1

3

You can change the position and size o editing control. To do so, you need to override PositionEditingControl of a cell and set the position and size of the editing panel and editing control:

public class MyTextBoxCell : DataGridViewTextBoxCell
{
    public override void PositionEditingControl(bool setLocation, bool setSize,
        Rectangle cellBounds, Rectangle cellClip, DataGridViewCellStyle cellStyle, 
        bool singleVerticalBorderAdded, bool singleHorizontalBorderAdded, 
        bool isFirstDisplayedColumn, bool isFirstDisplayedRow)
    {
        cellClip.Height = cellClip.Height *4; // ← Or any other suitable height
        cellBounds.Height = cellBounds.Height * 4;
        var r = base.PositionEditingPanel( cellBounds, cellClip, cellStyle, 
            singleVerticalBorderAdded, singleHorizontalBorderAdded, 
            isFirstDisplayedColumn, isFirstDisplayedRow);
        this.DataGridView.EditingControl.Location = r.Location;
        this.DataGridView.EditingControl.Size = r.Size;
    }
    public override void InitializeEditingControl(int rowIndex,
        object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
    {
        base.InitializeEditingControl(rowIndex, initialFormattedValue, 
            dataGridViewCellStyle);
        ((TextBox)this.DataGridView.EditingControl).Multiline = true;
        ((TextBox)this.DataGridView.EditingControl).BorderStyle = BorderStyle.Fixed3D;
    }
}

Then to use it, assign an instance of this cell, to CellTemplate property of the Column which you want to change its editor size:

this.dataGridView1.Columns[0].CellTemplate = new MyTextBoxCell();

Or you can create a new column and use your custom column:

public class MyTextBoxColumn:DataGridViewTextBoxColumn
{
    public MyTextBoxColumn()
    {
        CellTemplate = new MyTextBoxCell();
    }
}
Reza Aghaei
  • 120,393
  • 18
  • 203
  • 398
  • ``ctl.BorderStyle = BorderStyle.Fixed3D;`` fixes issue of bottom and top being clipped +1, but now there is double border. :( – bh_earth0 Jul 07 '21 at 12:40
  • @bh_earth0 Thanks for the feedback. This may help: https://stackoverflow.com/a/32170212/3110834 however I'm not sure if it's relevant. – Reza Aghaei Jul 07 '21 at 16:50