Winforms DataGridView使用换行文本在键盘上导航单元格
我希望只有在到达最顶端时才能导航到另一个单元格。 实际情况是,它在第四行(如果不是文本换行的话,也就是第一行)点击“up”键进行导航Winforms DataGridView使用换行文本在键盘上导航单元格,winforms,datagridview,Winforms,Datagridview,我希望只有在到达最顶端时才能导航到另一个单元格。 实际情况是,它在第四行(如果不是文本换行的话,也就是第一行)点击“up”键进行导航 你知道这是“设计的”还是可以避免的吗?处理键盘输入是DataGridView内部的编辑控件(实现IDataGridViewEditingControl的类)和DataGridView本身共同的责任 如果查看其中的源代码,您将看到编辑控件需要决定在何处处理按键。基本上,DataGridView通过调用 方法 这个方法包含一个bug,或者更好的是一个过度扩展。代码的意
你知道这是“设计的”还是可以避免的吗?处理键盘输入是
DataGridView
内部的编辑控件(实现IDataGridViewEditingControl
的类)和DataGridView
本身共同的责任
如果查看其中的源代码,您将看到编辑控件需要决定在何处处理按键。基本上,DataGridView通过调用
方法
这个方法包含一个bug,或者更好的是一个过度扩展。代码的意图似乎是“如果我已经在第一行,一个键控意味着用户想要移动到我上面的单元格”。不幸的是,在代码中,“第一行”是在第一个\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
这太简单了(它只是禁用了“移到上面的单元格”行为;您可能希望采取不同的行动,可能需要使用测量单元格内“真实”第一行的文本长度。这取决于您和您想要获得的内容
那么,就比较容易做到