Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winforms DataGridView使用换行文本在键盘上导航单元格_Winforms_Datagridview - Fatal编程技术网

Winforms DataGridView使用换行文本在键盘上导航单元格

Winforms DataGridView使用换行文本在键盘上导航单元格,winforms,datagridview,Winforms,Datagridview,我希望只有在到达最顶端时才能导航到另一个单元格。 实际情况是,它在第四行(如果不是文本换行的话,也就是第一行)点击“up”键进行导航 你知道这是“设计的”还是可以避免的吗?处理键盘输入是DataGridView内部的编辑控件(实现IDataGridViewEditingControl的类)和DataGridView本身共同的责任 如果查看其中的源代码,您将看到编辑控件需要决定在何处处理按键。基本上,DataGridView通过调用 方法 这个方法包含一个bug,或者更好的是一个过度扩展。代码的意

我希望只有在到达最顶端时才能导航到另一个单元格。 实际情况是,它在第四行(如果不是文本换行的话,也就是第一行)点击“up”键进行导航


你知道这是“设计的”还是可以避免的吗?

处理键盘输入是
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
这太简单了(它只是禁用了“移到上面的单元格”行为;您可能希望采取不同的行动,可能需要使用测量单元格内“真实”第一行的文本长度。这取决于您和您想要获得的内容

那么,就比较容易做到