C# 使用enter键覆盖datagridview的导航无效

C# 使用enter键覆盖datagridview的导航无效,c#,winforms,datagridview,keydown,onkeydown,C#,Winforms,Datagridview,Keydown,Onkeydown,我想修改datagridview当前与按enter键导航相关的行为。当前行为是跳到下一行和同一列,我想跳到下一列和同一行,因此我实现了以下keyDown事件: private void dataGridView1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { int numCols = this.dataGridView1.ColumnCount;

我想修改datagridview当前与按enter键导航相关的行为。当前行为是跳到下一行和同一列,我想跳到下一列和同一行,因此我实现了以下keyDown事件:

    private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        int numCols = this.dataGridView1.ColumnCount;
        int numRows = this.dataGridView1.RowCount;
        DataGridViewCell currCell = this.dataGridView1.CurrentCell;
        if (currCell.ColumnIndex == numCols - 1)
        {
            if (currCell.RowIndex < numRows - 1)
            {
                this.dataGridView1.CurrentCell = this.dataGridView1[0, currCell.RowIndex + 1];
            }
        }
        else
        {
            this.dataGridView1.CurrentCell = this.dataGridView1[currCell.ColumnIndex + 1, currCell.RowIndex];
        }
        e.Handled = true;
    }
}
因此,按下enter键时的当前行为仍然是默认行为:下一行和同一列


有什么想法吗?

你试过键控吗?我猜移动到另一行的默认行为会发生在KeyUp上,给它一个测试,按下enter键并按住它,看看它是否向下移动一列,或者它是否等待你设置KeyUp。也可以是按键,可以测试其中的每一个,因为您的事件可能在默认事件行为之前触发


另外,您确定具有事件订阅的代码正在执行吗?如果它是在标准位置,我会这样假设,但我只是排除了这样一种可能性,即您将该行放置在一个方法中,而该方法不只是为了以防万一而执行。

是的,我尝试了KeyUp和KeyPress,但它不起作用。如果我按enter键并按住它,它会依次移动到下一行和同一列,直到到达最后一行。此行为适用于所有事件,即keyUp、KeyDown和KeyPress。此外,我还检查了订阅事件的行是否正确执行,但尽管订阅操作正确,事件KeyDown、KeyUp或KeyPress始终不会触发。然而,在我做这个订阅的同一个地方,我做其他的订阅,比如cellParsing,这会激发。嗨,再次,我发现了正在发生的事情:KeyUp,KeyDown和KeyPress仅对类型为datagridviewcheckboxcolumn和datagridviewbuttoncolumn的datagridview列激发,但对其他类型(如DataGridViewComboxColumn、datagridviewtextboxcolumn或自定义列)不激发。我不知道如何解决这个问题。可能事件需要附加到所选的实际列,而不是gridview,可能是keydown正在单元格级别处理。
 private void dataGridView2_KeyDown(object sender, KeyEventArgs e)
 {
    if (e.KeyCode == Keys.Enter)
    {
        e.SuppressKeyPress = true;
        e.Handled = true;
        SendKeys.Send("{tab}");
    }
 }
 private void dataGridView2_KeyDown(object sender, KeyEventArgs e)
 {
    if (e.KeyCode == Keys.Enter)
    {
        e.SuppressKeyPress = true;
        e.Handled = true;
        SendKeys.Send("{tab}");
    }
 }