.NET DataGridViewで行ドラッグ移動を簡潔に行う

.NET DataGridViewですが行ドラッグ移動くらい標準でできるのかなと思っていましたができないんですね。IAWスキャンツールも面倒そうなのかやってない。以下のようにすると割とスマートにできました。説明はコメントをみてください。

       this.dgvParameters = new System.Windows.Forms.DataGridView();

        // For row drag
        private bool duringDrag = false;  // ドラック中かのフラグ
        private int dragFromRow = 0;      // ドラック開始行

        /* マウスボタンDownイベント / Start Row drag */
        private void dgvParameters_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) {
            // Remark: top of data row is 0
            if ( e.RowIndex < 0 && dgvParameters.RowCount < e.RowIndex ) {
                return;
            }
            duringDrag = true;
            dragFromRow = e.RowIndex;
        }

        /* マウス移動イベント Evrey Row drag */
        private void dgvParameters_CellMouseMove(object sender, DataGridViewCellMouseEventArgs e) {
            if ( duringDrag == false ) {    // Not dragging
                return;
            }

            /* マウスイベントはたくさん発生するので、ここで時間でイベント間引きするとベスト */

            // Remark: top of data row is 0
            if ( e.RowIndex < 0 && dgvParameters.RowCount < e.RowIndex ) {
                duringDrag = false;     // Cancel dragging.
                dragFromRow = 0;
                return;
            }

            int dragToRow = e.RowIndex;
            if ( dragFromRow == dragToRow ) {
                return;             // 同じ行内ならスルー
            }

            // Delect and insert target row.
            DataGridViewRow from = dgvParameters.Rows[ dragFromRow ]; // 移動元行を取り出す
            dgvParameters.Rows.RemoveAt( dragFromRow );               // 移動元行をGridから削除
            dgvParameters.Rows.Insert( dragToRow, from );             // 移動元行をGridの指定行に追加
            dgvParameters.Rows[dragToRow].Selected = true;            // 行選択を移動

            dragFromRow = dragToRow;    // Set next drag row. 移動元行を現在行に切替え
        }
        
        /*  マウスボタンUPイベント / End Row drag */
        private void dgvParameters_CellMouseUp(object sender, DataGridViewCellMouseEventArgs e) {
            if ( duringDrag == false ) {    // Not dragging
                return;
            }

            duringDrag = false ;    // End dragging
            dragFromRow = 0;
        }

このロジックだと、移動中動きを見せつつ、上方向の移動と下方向の移動も同じロジックで両立できます。実行結果は以下のとおりです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です