答案 0 :(得分:2)
键盘输入的处理是由IDataGridViewEditingControl
和DataGridView
内部的编辑控件(实现DataGridView
的类)共享的责任。
如果查看DataGridView中的源代码,您将看到编辑控件需要决定在何处处理按键。基本上,DataGridView会询问IDataGridViewEditingControl
(在您的情况下,DataGridViewTextBoxEditingControl
)"您要处理它吗?"通过调用
EditingControlWantsInputKey方法。
此方法包含错误,或更好的过度简化。代码的意图似乎是"如果我已经在第一行,KeyUp意味着用户想要移动到我上面的单元格#34;。不幸的是,"第一线"在代码中,是第一个\r\n
之前的任何内容,无视自动换行。这是你在观察的内容。
幸运的是EditingControlWantsInputKey
是公共虚拟的,因此您可以从DataGridViewTextBoxEditingControl
派生并调整与您的需求相对应的行为。
例如:
public class MyDataGridViewTextBoxEditingControl : DataGridViewTextBoxEditingControl {
public override bool EditingControlWantsInputKey(Keys keyData, bool dataGridViewWantsInputKey) {
switch (keyData & Keys.KeyCode)
{
case Keys.Up:
return false; // never pass KeyUp to the DataGrid
...
// call base.EditingControlWantsInputKey when
// you want to retain the standard behaviour
这是过于简单的(它只是禁用"移动到上面的单元格"行为;你可能想要采取不同的行为,也许可以测量文本长度适合"真实"第一行使用Graphics.MeasureString在单元格内部。这取决于您和您想要获得的内容。
然后,replace the standard controls for DataGridView cells with your own相对容易。