如何使 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/