KeyDown または PreviewKeyDown イベントで DataGridView の n 行を上下にジャンプ

KeyDown または PreviewKeyDown イベントの DataGridView で n 行上または下にジャンプするための解決策
以下に示します:

DataGridView の矢印キー ナビゲーションの実装に問題があります (データソースは使用されていません)。
DataGridView には 2 つの異なるタイプの項目があり、ほとんどの場合、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;
                        }
                    }
                }
            }


このイベントが実際にいつ自動的に処理されるのか見当がつかないので、キー アップ ダウン イベントの独自の動作を実現したいと考えています。私を助けてください、C# の DataGridViews とその迷惑なイベントを追跡するのは非常に困難です。これらのグリッドのすべてのイベントは異なる方法で処理されるようです。一部のイベントでは新しい状態が既に適用されており、他のイベント (OnSelectionChanged) では後で処理されます。文書化が不十分で直感的ではありません。このバックグラウンドのすべてを回避/オーバーライドしたい.

わかりました、イベント メソッドを 1 つだけ使用して解決策を見つけました:

これが私のコードです。evenArgs を処理済みとして設定し、グリッドの独自の update メソッドを実行することが重要です:

    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();
    }

そこに同じタイプのアイテムがあると予想されるため、常に2行上下にジャンプしますが、UpdateAll()メソッドで、それが正しいかどうかを再度確認し、必要に応じて修正します。それ以外の場合(すでに正しい場合)、視覚化を更新しますデータの (そして、選択したエントリの詳細で他のグリッドを埋めます)。これが他の人にも役立つことを願っています。

両方のイベントに -2 と + 2 がある可能性があります。後で何らかの処理を行っているため、これらの値は必要なインデックスです。ケースに応じて調整するか、特定のインデックスを指定します (質問に示されているように)。