DataGridView: How can I make the enter key add a new line instead of changing the current cell?

.net, datagridview, winforms

Solution

Well, I found out how to solve the problem. First, create a class called `CustomDataGridViewTextBoxEditingControl` which derives from `DataGridViewTextBoxEditingControl`, and override `EditingControlWantsInputKey` like this:

public class CustomDataGridViewTextBoxEditingControl : DataGridViewTextBoxEditingControl
    {
        public override bool EditingControlWantsInputKey(
        Keys keyData, 
        bool dataGridViewWantsInputKey)
        {
            switch (keyData & Keys.KeyCode)
            {
                case Keys.Enter:
                    // Don't let the DataGridView handle the Enter key.
                    return true;
                default:
                    break;
            }

            return base.EditingControlWantsInputKey(keyData, dataGridViewWantsInputKey);
    }
}

This stops the `DataGridView` from handing the Enter key and changing the current cell. It does not, however, make the Enter key add a new line. (It appears that the `DataGridViewTextBoxEditingControl` has removed the functionality of the Enter key). Therefore, we need to override `OnKeyDown` and implement the functionality ourselves, like this:

protected override void OnKeyDown(KeyEventArgs e)
{
    switch (e.KeyCode & Keys.KeyCode)
    {
        case Keys.Enter:
            int oldSelectionStart = this.SelectionStart;
            string currentText = this.Text;

            this.Text = String.Format("{0}{1}{2}",
                currentText.Substring(0, this.SelectionStart),
                Environment.NewLine,
                currentText.Substring(this.SelectionStart + this.SelectionLength));

            this.SelectionStart = oldSelectionStart + Environment.NewLine.Length;
            break;
        default:
            break;
    }

    base.OnKeyDown(e);
}

Then, create a class called `CustomDataGridViewTextBoxCell` which derives from `DataGridViewTextBoxCell`, and override the `EditType` property to return the type of `CustomDataGridViewTextBoxEditingControl`.

public class CustomDataGridViewTextBoxCell : DataGridViewTextBoxCell
{
    public override Type EditType
    {
        get
        {
            return typeof(CustomDataGridViewTextBoxEditingControl);
        }
    }
}

After you do this, you can set the `CellTemplate` property on an existing column to a `CustomDataGridViewTextBoxCell`, or you can create a class derived from `DataGridViewColumn` with `CellTemplate` preset to a `CustomDataGridViewTextBoxCell`, and you will be all set!

Problem

How can I make the Enter key behave in a Winforms `DataGridViewTextBoxCell` like it does in a normal Winforms `TextBox` (add a new line to the text, instead of changing the current cell)?

Original source