さて、今回はボタンのイベントについてです。
ボタンは必ずと言って良いほど登場するコントロールです。
パスワード管理ツールでは、「ID取得」「パスワード取得」「編集」「保存」という4つのボタンを作りました。
ここでは、それぞれのボタンが押されたとき、どんな処理を行っているのかを中心に解説したいと思います。
ID取得ボタン
ID取得ボタンがマウスでクリックされると、このイベントハンドラが実行されます。
やりたいことは、DataGridViewで選択されている行から、IDを取得してクリップボードにコピーするというものです。
DataGridViewコントロールには、CurrentRowプロパティというのがあって、ここにカレント行の番号(0から始まる連番)が格納されています。
カレント行とは、マウスで任意のセルをクリックした時、背景色が青くなりますが、このセルがカレントセルで、カレントセルがある行(左端に▶マーク)がカレント行です。

言い換えると、クリック=選択ということになりますから、選択されたセルがある行の番号ということになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
/// <summary> /// ID取得ボタンクリック処理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void UxIdToClip_Click(object sender, EventArgs e) { //カレント行に登録されているIDを取得 var row = uxIdPasswordGrid.CurrentRow; var id = row.Cells["ID"].Value.ToString(); if (id != "") { //クリップボードへコピー Clipboard.SetText(id); } } |
ちなみに、セルは複数選することが出来ますが、その場合は最後にマウスボタンから手を離したセルがカレントセルになります。

カレント行の番号を取得し、その行の列名が「ID」の値を取り出すには、下記の様に記述します。
1 2 |
var row = uxIdPasswordGrid.CurrentRow; var id = row.Cells["ID"].Value.ToString(); |
セルから値を取り出すためのプロパティとしてValueが用意されていますが、これは object 型といって、どんな型でも代入できる特殊な型になります。
つまり、中にどんな型が入っているか分からないので、取り出す時は明示的に指定する必要があり、この例では文字列として取り出すように書いています。
今回、 row とか id という変数を使っていますが、本来は正しい型を指定しなければなりません。
1 2 |
DataGridViewRow row = uxIdPasswordGrid.CurrentRow; string id = row.Cells["ID"].Value.ToString(); |
しかし、いちいち型を書くのが面倒なので、省略型として var が用意されています。
var を付けることで、 Visual Studio が適切な型を推測して、あたかもその型をこちらが指定したかのように扱ってくれます。
取得したIDをクリップボードへコピーするには、 Clipboar.SetText というメソッドを使います。
ここで注意が必要なのは、IDのセルが未入力の状態です。
row.Cells[“ID”].Value.ToString() を実行した際、値が未入力だと空の文字列 ”” が返ってきます。
この空の文字列をSetTextメソッドに渡してしまうとエラーになるので、 if 文でチェックしています。
1 2 3 4 5 |
if (id != "") { //クリップボードへコピー Clipboard.SetText(id); } |
余談ですが、セルから値を取得する方法として、今回は列名を指定しましたが、次の様に列番号を指定することも可能です。
row.Cells[2].Value.ToString()
列番号は左から0、1、2、・・・ と言う風に割り当てられています。
パスワード取得ボタン
パスワード取得ボタンもID取得ボタンとほとんど同じで、参照する列が変わるだけです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
/// <summary> /// パスワード取得ボタンクリック処理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void UxPwdToClip_Click(object sender, EventArgs e) { //カレント行に登録されているパスワードを取得 var row = uxIdPasswordGrid.CurrentRow; var pwd = row.Cells["パスワード"].Value.ToString(); if (pwd != "") { //クリップボードへコピー Clipboard.SetText(pwd); } } |
編集ボタン
編集ボタンは少しコード量が多くなります。
やりたいことは
- 「書き込み禁止モード」の状態を反転
- 書き込み禁止状態状態に応じて、ボタンの表記、背景色、行追加機能の有効/無効を切り替え
- カテゴリードロップダウンリストを再作成
の3つです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
/// <summary> /// 編集ボタンクリック処理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void UxEditMode_Click(object sender, EventArgs e) { //ReadOnlyプロパティの状態を反転 uxIdPasswordGrid.ReadOnly = !uxIdPasswordGrid.ReadOnly; //IDパスワード一覧の書き込み禁止モードを有効にする if(uxIdPasswordGrid.ReadOnly == true) { //編集ボタンのテキストと背景色を設定(最初の状態に戻す) uxEditMode.Text = "編集"; uxEditMode.BackColor = SystemColors.Control; //ユーザーによる行追加を禁止にする uxIdPasswordGrid.AllowUserToAddRows = false; //カテゴリドロップダウンリストを作り直す RefreshDropDownList(); } else { //編集ボタンのテキストと背景色を編集中に設定 uxEditMode.Text = "編集中"; uxEditMode.BackColor = Color.Yellow; //ユーザーによる行追加を有効にする uxIdPasswordGrid.AllowUserToAddRows = true; } } |
まず、このボタンをクリックするたび、編集状態と参照状態が入れ替わる、いわゆるトグルスイッチ的な動作になります。
そのため、uxIdPasswordGrid.ReadOnly の状態を反転させて入れな直すという処理を最初に入れています。
1 |
uxIdPasswordGrid.ReadOnly = !uxIdPasswordGrid.ReadOnly; |
!マークは値を反転させる(trueの場合は falseに、falseの場合は trueに)という演算子です。
そして、反転させた結果を元に条件判断を行っています。
1 |
if(uxIdPasswordGrid.ReadOnly == true) |
true とか false というキーワードが出てきましたが、これは bool という 型で、true(真)かfalse(偽)の2つしか値を取ることが出来ない型です。
== 演算子で true か否かを判定していますが、そもそも ReadOnly プロパティは trueか false しか値を取り得ないので、以下の様に記述してもOKです。
1 |
if(uxIdPasswordGrid.ReadOnly) |
ReadOnlyの値がtrueの場合、まずボタンの表記を「編集」にし、背景色をボタンの初期値に戻し、DataGridViewでユーザーが行を追加できないような処理を記述しています。
TextBoxコントロールには、ボタンの文言を設定するTextプロパティと、ボタンの背景色を設定するBackColorプロパティがありますので、これを使います。
色については、Color クラスを用いて色を指定してもよいのですが、SystemColorsというクラスを使うと、コントロールの初期値が簡単に取得できますので、今回はこちらを使用しました。
また、ユーザーによる行追加の可否は、DataGridView AllowUserToAddRows プロパティに true か false を代入することで制御しています。
1 2 3 4 5 6 |
//編集ボタンのテキストと背景色を設定(最初の状態に戻す) uxEditMode.Text = "編集"; uxEditMode.BackColor = SystemColors.Control; //ユーザーによる行追加を禁止にする uxIdPasswordGrid.AllowUserToAddRows = false; |
最後にカテゴリ ComboBoxのドロップダウンリストを作り直すメソッドを読んでいます。
1 |
RefreshDropDownList(); |
これについては次回の記事にて、ComboBox コントロールのイベントと合わせて解説します。
保存ボタン
保存ボタンについては、単純にDataGridの機能を使ってファイルを保存するだけなので簡単です。
1 2 3 4 5 6 7 8 9 |
private void UxSave_Click(object sender, EventArgs e) { //IDパスワード一覧をファイルに保存 DataTable dt = (DataTable)uxIdPasswordGrid.DataSource; dt.WriteXml(_idPassFile); //メッセージの表示 MessageBox.Show("保存しました"); } |
LoadイベントでファイルをDataTableに読み込み、DataGridViewの DataSourceプロパティに代入しましたが、今度はDataSourceプロパティからDataTabeを取り出しています。
そして、DataTableの WriteXml メソッドを使って、Xml形式のテキストファイルに出力しています。
その際 _idPassFile に格納されているファイル名を用いています。
MessageBoxというのは、画面にアラートを表示するクラスです。

MessageBoxには最大4つまでの引数を指定でき、それぞれの引数は以下の様な意味を持ちます。

ボタンは6パターン、アイコンは8パターンが指定できますが、アイコンについては異なる名前に同じアイコンが割り当てられているため、実際は4パターンになります。
詳細については、こちらにをご参照下さい。

まとめ
如何でしたでしょうか?
今回は「ID取得」「パスワード取得」「編集」「保存」という4つのボタンに関するイベントハンドラを説明しました。
「編集」ボタンだけが少しややこしかったかもしれませんが、編集と参照を切り替えるための制御を行っているだけなので、内容としては単純です。
次回は、ComboBoxとDataGridVIewのキー入力イベントについて解説したいと思います。