DataGridView使用包装文本在KeyUp上导航单元格

时间:2017-03-27 11:08:39

标签: winforms datagridview

enter image description here

我希望只有在到达顶部时才能导航到另一个单元格。 实际发生的是它在第四行(即第一行,如果不是文本换行)点击“向上”键导航。

你知道它是'按设计'还是可以避免?

1 个答案:

答案 0 :(得分:2)

键盘输入的处理是由IDataGridViewEditingControlDataGridView内部的编辑控件(实现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相对容易。