在 KeyDown 或 PreviewKeyDown 事件中在 DataGridView 中向上或向下跳转 n 行

Jump n Rows Up or Down in DataGridView on KeyDown or PreviewKeyDown Events

我无法实现 DataGridView 的箭头键导航(未使用数据源)。 DataGridView 有 2 种不同类型的项目,大多数时候每隔一个项目是第一种类型,反之亦然,其他项目是第二种类型。现在,如果有人按下 KeyUp / Down,我希望 DataGridView 跳转到给定索引的一行,而不是向上或向下。

无论我如何尝试解决这个问题,都不清楚活动何时真正结束。如果我在 _previewKeyDown 方法中尝试这个:

if (DgvCarPosAndTrafficMsg.CurrentRow != null)
        {
            if (e.KeyCode == Keys.Down)
            {
                if (DgvCarPosAndTrafficMsg.SortOrder == SortOrder.Ascending)
                {
                    for (int i = DgvCarPosAndTrafficMsg.CurrentRow.Index; i < SessionItems.Count; i++)
                    {
                        if (SessionItems[i] is CarPosItem)
                        {
                            DgvCarPosAndTrafficMsg.Rows[i].Selected = true;
                            break;
                        }
                    }
                }
                else
                {
                    for (int i = DgvCarPosAndTrafficMsg.CurrentRow.Index; i > 0; i--)
                    {
                        if (SessionItems[i] is CarPosItem)
                        {
                            DgvCarPosAndTrafficMsg.Rows[i].Selected = true;
                            break;
                        }
                    }
                }
            }
            else if (e.KeyCode == Keys.Up)
            {

                if (DgvCarPosAndTrafficMsg.SortOrder == SortOrder.Descending)
                {
                    for (int i = DgvCarPosAndTrafficMsg.CurrentRow.Index; i < SessionItems.Count; i++)
                    {
                        if (SessionItems[i] is CarPosItem)
                        {
                            DgvCarPosAndTrafficMsg.Rows[i].Selected = true;
                            break;
                        }
                    }
                }
                else
                {
                    for (int i = DgvCarPosAndTrafficMsg.CurrentRow.Index; i > 0; i--)
                    {
                        if (SessionItems[i] is CarPosItem)
                        {
                            DgvCarPosAndTrafficMsg.Rows[i].Selected = true;
                            break;
                        }
                    }
                }
            }

它仍然会向上或向下跳 1 行。 我不知道这个事件什么时候被自动处理,我想有我自己的按键事件行为。请帮助我,C# 中的 DataGridViews 及其烦人的事件对我来说很难追踪。似乎这些网格的每个事件的处理方式都不同,对于某些事件,新状态已经应用,对于其他事件(OnSelectionChanged),它会在之后处理。它的记录很差而且不直观,我想避免/覆盖所有这些背景内容。

好的,我找到了一个解决方案,只使用一种事件方法:

这是我的代码,将 evenArgs 设置为已处理很重要,然后执行您自己的网格更新方法:

    private void DgvCarPosAndTrafficMsg_KeyDown(object sender, KeyEventArgs e)
    {
        int diffDown;
        int diffUp;
        if (DgvCarPosAndTrafficMsg.SortOrder == SortOrder.Descending)
        {

            diffDown = 1;
            diffUp = -2;
        }
        else
        {

            diffDown = 2;
            diffUp = -1;
        }

        if (DgvCarPosAndTrafficMsg.CurrentRow != null)
        {
            if (e.KeyCode == Keys.Down && DgvCarPosAndTrafficMsg.CurrentRow.Index < DgvCarPosAndTrafficMsg.Rows.Count - diffDown)
            {

                DgvCarPosAndTrafficMsg.CurrentCell = DgvCarPosAndTrafficMsg.Rows[DgvCarPosAndTrafficMsg.CurrentRow.Index + diffDown].Cells[0];
            }
            else if (e.KeyCode == Keys.Up && DgvCarPosAndTrafficMsg.CurrentRow.Index + diffUp > 0)
            {

                DgvCarPosAndTrafficMsg.CurrentCell = DgvCarPosAndTrafficMsg.Rows[DgvCarPosAndTrafficMsg.CurrentRow.Index + diffUp].Cells[0];
            }

        }
        e.Handled = true;
        DgvCarPosAndTrafficMsg_UpdateAll();
    }

我总是跳 up/down 2 行,因为我希望那里有相同类型的项目,但在我的 UpdateAll() 方法中我再次检查它是否正确,并在需要时更正它,否则(如果已经正确)我更新了数据的可视化(并用所选条目的详细信息填充其他网格)。我希望这也会对其他人有所帮助。

你可能对这两个事件都有 -2 和 + 2,我之后会进行一些处理,所以这些值是我需要的索引,根据你的情况调整它或给出一个特定的索引(如问题中所示)