.net - DataGridView:如何让回车键添加新行而不是更改当前单元格?

标签 .net winforms datagridview

如何使 Enter 键在 Winforms DataGridViewTextBoxCell 中的行为就像在普通 Winforms TextBox 中一样(向文本添加新行,而不是更改当前单元格)?

最佳答案

嗯,我知道如何解决这个问题了。首先,创建一个名为 CustomDataGridViewTextBoxEditingControl 的类源自 DataGridViewTextBoxEditingControl ,并覆盖 EditingControlWantsInputKey像这样:

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);
    }
}

这会停止 DataGridView从传递 Enter 键并更改当前单元格。但是,它不会使 Enter 键添加新行。 (看起来 DataGridViewTextBoxEditingControl 已经删除了 Enter 键的功能)。因此,我们需要重写 OnKeyDown并自己实现该功能,如下所示:

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);
}

然后,创建一个名为 CustomDataGridViewTextBoxCell 的类源自 DataGridViewTextBoxCell ,并覆盖EditType属性返回 CustomDataGridViewTextBoxEditingControl 的类型.

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

执行此操作后,您可以设置 CellTemplate将现有列上的属性设置为 CustomDataGridViewTextBoxCell ,或者您可以创建一个从 DataGridViewColumn 派生的类与 CellTemplate预设为CustomDataGridViewTextBoxCell ,一切就都准备好了!

关于.net - DataGridView:如何让回车键添加新行而不是更改当前单元格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2030542/

相关文章:

javascript - 将文件存档到客户计算机上

c# - String 未被识别为有效的 DateTime 格式异常

c# - 如何限制用户只能使用 Linq To SQL 编辑数据?

c# - 更改焦点上组合框的边框颜色

.net - 如何安全访问 DataGridView 列名?

c# - WPF:如何在代码中设置段落的内容?

c# - 将表单上的控件移动到选项卡上

c# - C# 图形用户界面

mysql - 为什么我的 datagridview 不显示任何结果?

c# - 如何在 DataGridView 中查找带有列索引的列名?