protected override void OnKeyDown(KeyEventArgs e, int rowIndex) { // カレントセルにする行Index int curIndex = -1; // 列ヘッダの場合は、基底クラスに任す if(rowIndex >= 0) { // ↑キー if(e.KeyCode == Keys.Up) { if(e.Control) { // Ctrlキーが押下されていた場合は // 最初の行をカレントセルに設定 curIndex = 0; } else { if(TopRowIndex(rowIndex) > 0) { // 一つ上の結合セルのグループの上端の行を // カレントセルのIndexに設定 curIndex = TopRowIndex(TopRowIndex(rowIndex) - mergeRows); } else { // 自身が一番上の結合グループのセルの場合は、 // 自身の結合グループの上端の行(Index=0)を // カレントセルのIndexに設定 curIndex = 0; } } // カレントセルを設定 this.DataGridView.CurrentCell = this.DataGridView[ColumnIndex, curIndex]; e.SuppressKeyPress = true; } // ↓キー else if(e.KeyCode == Keys.Down) { if(e.Control) { // Ctrlキーが押下されていた場合は最後の行を // カレントセルのIndexに設定 curIndex = TopRowIndex(this.DataGridView.RowCount - 1); } else { if(TopRowIndex(rowIndex) + mergeRows <= this.DataGridView.RowCount) { // 自身のセルの属する結合グループより下に、 // 行が存在する場合、自身のグループの下端の // 次の行をカレントセルのIndexに設定 curIndex = TopRowIndex(TopRowIndex(rowIndex) + mergeRows); } else { // 自身のセルの属する結合グループより下に、 // 行がない場合は、自身のグループの中の下端の行を // カレントセルのIndexに設定。 // MergeRow分の行がない可能性もあるので、 // DataGridViewの下端のIndexを設定している。 curIndex = TopRowIndex(this.DataGridView.RowCount - 1); } } // カレントセルを設定 this.DataGridView.CurrentCell = this.DataGridView[ColumnIndex, curIndex]; e.SuppressKeyPress = true; } } else { // ↑↓キー以外は通常の処理へ base.OnKeyDown(e, rowIndex); } }
コードをみて、アレッ?て感じた方が多いのではないでしょうか。Shiftキーを処理していません。
MultiSelectを無視しちゃっています。
ここで、中途半端に処理しちゃうととんでもない方向に向いて行ってしまいそうなので、敢えて無視しました。取りあえず、限定した使用方法では使えるかなぁって感じにだけ収めました。
次回にでも、ここまでを纏めて、問題点などを改めて考えてみたいと思っています。
0 件のコメント:
コメントを投稿