さて、今回は一覧部分で使っているDataGridViewのイベントについて解説します。
DataGridViewはDataTableと一緒に使われることが多く、その機能も豊富です。
ここでは、今回のパスワード管理ツールで使っているごく一部のイベントだけに絞っていますが、一覧で行追加や行削除を行う際に必要な知識となります。
キー入力イベント
ここでやりたい事は、編集モードか否かを判断し、編集モードであれば、削除キー(DELキー)が押された時に、カレント行を削除するという内容です。
DataGridVIewにはキー入力で次の3つのイベントが発生します。

KeyDownとKeyPressの違いは、KeyDownが全てのキーに対して発生するのに対し、KeyPressは文字キーが押されたときだけ発生します。
つまり、’A’ とか ’1’ を押したとき、両方のイベントが発生しますが、シフトキーやALTキーなどの修飾キーが押さた場合は、KeyPress は発生しないという事です。
今回は 削除キーを判断したいので、KeyDownのイベントハンドラを使いました。
では、さっそくソースコードを見ていきましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
private void UxIdPasswordGrid_KeyDown(object sender, KeyEventArgs e) { //書き込み禁止モードか? if (uxIdPasswordGrid.ReadOnly) { return; } //DELキーが押されたか? if (e.KeyCode != Keys.Delete) { return; } //最下段(空白行)か? if (uxIdPasswordGrid.CurrentRow.IsNewRow == true) { return; } //カレント行を削除 uxIdPasswordGrid.Rows.Remove(uxIdPasswordGrid.CurrentRow); } |
編集モードの判定
編集モードであるかどうかは、DataGridViewのReadOnlyプロパティで判断します。
1 2 3 4 5 |
//書き込み禁止モードか? if (uxIdPasswordGrid.ReadOnly) { return; } |
編集モードか否かを判定する方法としていくつかの方法が考えられます。
- DataGridView の ReadOnlyプロパティが false なら編集モードと判断
- DataGridVIewの AllowUserToAddRows プロパティが true なら編集モードと判断
- 別途、編集ボタンクリック時に true を代入するbool型の変数を用意し、これを使って編集モードを判断
- 編集ボタンのText プロパティが “編集中” であれば編集モードであると判断
これらはどの方法を使っても編集モードが否かを判断できますが、一番お薦めできないのが、4です。
一見分かり易そうですが、Textプロパティは単なる表記の文言を入れているだけで、将来変更される可能性が一番高いです。
1と2はDataGridViewのプロパティを使うという意味では同じですが、より直感的なのがReadOnlyかと思います。
3については、実際によく使われる方法ではあるのですが、わざわざ別途変数を用意しなくとも、ReadOnlyを使えばことが足りるので、今回は不採用にしました。
ReadOnlyで編集モードを判定した結果、編集モードだった場合は何もせずReturnしています。
最下段か否かの確認
削除する上で1点注意があります。
DataGridViewにおいて、ユーザーの行追加を許可した場合、常に一番下の段(最下段)に空白行が作られます。
この空白行は中身が確定していないものなので、行削除を行うとエラーが発生します。
そのエラーを発生させないため、最下段なら何もしないという処理を入れています。
1 2 3 4 5 |
//最下段(空白行)か? if (uxIdPasswordGrid.CurrentRow.IsNewRow == true) { return; } |
DELキーの確認
KeyDown イベントで押されたキーを判定するには、イベントハンドラに渡される KeyEventArgs のKeyCodeプロパティを使います。
1 2 3 4 5 6 7 |
//DELキーが押されたか? if (e.KeyCode == Keys.Delete) { //カレント行を削除 uxIdPasswordGrid.Rows.Remove(uxIdPasswordGrid.CurrentRow); } |
ここで、DELキー以外が押された時に、DataGridViewのRows.Removeメソッド (正確には DataGridViewのRowプロパティに入っているDataRowクラスのRemoveメソッド) を呼び出して、カレント行を削除しています。
まとめ
如何でしたでしょうか。
今回は編集モードにおいて、一覧部分の行削除についてのプログラムコードを解説しました。
以上で一通りの説明が終わりました。
初めてプログラムを作る方にとっては、少々難しかったかもしれません。
しかし、すべて理解しようとするのではなく、何となく理解できればそれでOKです。
色々なプログラムを作っていくうちに、だんだん理解が深くなっていきます。
初めてゲームをするとき、なかなかスコアが上がらないと思いますが、何度もやっていくうちに、意識しない間に上達してきて、スコアが上がっていきますよね。
あれとまったく同じです。
今は、感覚でとらえて頂く方が良いかと思います。
そして、出来るだけ数をこなして、経験値を上げていけば、かならず上達します。