さて、今回からコードエディターを使ってプログラムを書いていきます。
今回手始めに、全体のソースコードの掲載とイベントハンドラに至るまでの冒頭の処理について解説したいと思います。
ソースを見て内容が理解できる方は、読み飛ばしてもらえれば結構です。
全体のソースコード
全体のソースコードは以下の通りです。
尚、簡単な動作確認は行っていますが、全てのバグを取り切ってはいませんので、その点はご了承ください。
今は中身が理解できないと思いますので、ここでは全体の雰囲気を把握するという意味で、軽く目をとおしていただければ結構です。
Visual Studio 2019 のプロジェクトファイル一式は、下記からダウンロードできますので、入力が面倒という方はご利用ください。
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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 |
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.IO; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace PasswordManager { public partial class MainForm : Form { /// <summary> /// IPパスワードファイル名 /// </summary> private string _idPassFile = "IdPass.xml"; /// <summary> /// 画面に配置するコントロールの登録と初期化 /// </summary> public MainForm() { InitializeComponent(); //プログラムを画面の真ん中に表示 this.StartPosition = FormStartPosition.CenterScreen; } /// <summary> /// 画面表示時の初期化処理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void MainForm_Load(object sender, EventArgs e) { //ウィンドウのサイズを固定にする this.FormBorderStyle = FormBorderStyle.FixedSingle; //IDパスワード一覧に表示するデータの作成 DataTable dt = new DataTable(); dt.Columns.Add("カテゴリ"); dt.Columns.Add("アプリ/サイト名"); dt.Columns.Add("ID"); dt.Columns.Add("パスワード"); //テーブル名を設定 dt.TableName = "IdPass"; //既に保存済みの/IDパスワードファイルがあれば、読み込む if (File.Exists(_idPassFile)) { dt.ReadXml(_idPassFile); } ///IDパスワード一覧に表示 uxIdPasswordGrid.DataSource = dt; //IDパスワード一覧の初期設定 uxIdPasswordGrid.SelectionMode = DataGridViewSelectionMode.CellSelect; //行選択モードの設定 uxIdPasswordGrid.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; //列を左右一杯に広げる uxIdPasswordGrid.AlternatingRowsDefaultCellStyle.BackColor = Color.Linen; //1行置きの背景色を設定 uxIdPasswordGrid.ReadOnly = true; // 書き込み禁止の設定 uxIdPasswordGrid.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableWithoutHeaderText; //コピーした値にヘッダを含まない uxIdPasswordGrid.AllowUserToAddRows = false; //ユーザーの行追加を禁止にする } /// <summary> /// 保存ボタンクリック処理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void UxSave_Click(object sender, EventArgs e) { //IDパスワード一覧をファイルに保存 DataTable dt = (DataTable)uxIdPasswordGrid.DataSource; dt.WriteXml(_idPassFile); //メッセージの表示 MessageBox.Show("保存しました"); } /// <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); } } /// <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); } } /// <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; } } /// <summary> /// カテゴリドロップダウンリスト表示時の処理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void UxCategory_DropDown(object sender, EventArgs e) { //カテゴリドロップダウンリストの中身が0なら、作り直す if (uxCategory.Items.Count == 0) { RefreshDropDownList(); } } /// <summary> /// カテゴリドロップダウンの再作成 /// </summary> private void RefreshDropDownList() { uxCategory.Items.Clear(); uxCategory.Items.Add(""); for (int i = 0; i < uxIdPasswordGrid.Rows.Count; i++) { var category = uxIdPasswordGrid["カテゴリ", i].Value.ToString(); if (! uxCategory.Items.Contains(category)) { uxCategory.Items.Add(category); } } } /// <summary> /// カテゴリドロップダウンリスト選択時の処理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void UxCategory_SelectedIndexChanged(object sender, EventArgs e) { var dt = (DataTable)uxIdPasswordGrid.DataSource; if (uxCategory.Text == "") { dt.DefaultView.RowFilter = ""; } else { dt.DefaultView.RowFilter = "カテゴリ = '" + uxCategory.Text + "'"; } } /// <summary> /// キー入力の処理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void UxIdPasswordGrid_KeyDown(object sender, KeyEventArgs e) { //書き込み禁止か? if (uxIdPasswordGrid.ReadOnly) { return; } //最下段(空白行)か? if (uxIdPasswordGrid.CurrentRow.IsNewRow == true) { return; } //DELキーが押されたか? if (e.KeyCode == Keys.Delete) { //カレント行を削除 uxIdPasswordGrid.Rows.Remove(uxIdPasswordGrid.CurrentRow); } } } } |
冒頭部分の説明
では、イベントハンドラに入るまでの冒頭部分のプログラムコードについて、説明をしていきます。
先頭の using について
ファイルの冒頭に using ~ という記述がありますが、これは既存の共通クラス(汎用低が高く、共通に使えるクラス)の中で、今回はどれを使うかを記述する部分です。
画面のあるアプリケーションを作成する場合、下記の内容が自動で記述されるようになっていて、使う頻度の高い標準的な共通クラスが記述されます。
実は、自分で作った共通クラスを利用したい場合は、ここに記述します。
現時点では、おまじない的なものと考えてもらって結構です。
1 2 3 4 5 6 7 8 9 10 |
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.IO; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; |
ネームスペース について
using の次に namespace(=ネームスペース) というのが登場しました。
これは、ここで記述されているクラスが所属する名前となります。
ちょっと分かり難いかもしれませんが、例えると苗字みたいなものです。
鈴木家には、太郎君と花子さんがいたとして、山田家にも太郎君と花子さんがいるとします。
この状態で「太郎君」と呼んでも、鈴木家の太郎君なのか、山田家の太郎君なのか区別できませんよね。
そこで「鈴木家」「山田家」という指定をすることになると思いますが、これが namespace の役割です。
そして、先ほど using について説明しましたが、実は namespace が記述されています。
今回は namespace に PasswordManager という名前が付けられていますが、もし今回のクラスを他のプロジェクト内で使おうとした場合、using PasswordManager という風に記述します。
1 2 3 4 5 6 7 |
namespace PasswordManager { public partial class MainForm : Form { ・・・中略・・・・・・ } } |
クラス名について
namespace の { } 内に書かれているものが、クラスになります。
public と書くことで、他のクラスから呼び出すことが出来る様になります。
次に partial ですが、これはあっても無くても良いのですが、Visual Studioが自動で付加してくれています。
parsial を付けると、そのクラスを複数のファイルに分割して記述することができます。
というのは、実は1つのクラスを複数のファイルに分けて書くことはできません。
言い換えると、1つのクラスは1つのファイル内に完結させるという制約があるのですが、 parsial を付けることで、1つのクラスを複数のファイルに分けて記述することができるようになります。
ちなみに、私は今まで使ったことは無いです。
次にこれがクラスであることを示す class と、その直後にクラス名が並びます。
最後に : Form という記述がありますが、これは Form クラスを継承するという意味です。
継承については、こちら に解説しています。
1 2 3 4 |
public partial class MainForm : Form { ・・・中略・・・・・・ } |
メンバ 変数
メンバ 変数とは、そのクラスの中で使うための変数であり、クラス内のメソッドから自由にアクセスが可能です。
メンバ変数には、その有効範囲(スコープ)を示すキーワードがあり、変数の前に public を記述すると、他のクラスから自由にアクセスできるようになります。
今回はクラスの中だけなので private というキーワードを メンバ 変数の前に置いています。
ちなみに、有効範囲を示すキーワードを指定しない場合、private 扱いになります。
1 2 3 4 5 6 |
public partial class MainForm : Form { /// <summary> /// IPパスワードファイル名 /// </summary> private string _idPassFile = "IdPass.xml"; |
メンバ変数の名前の先頭にアンダースコア ‘_’ を書いていますが、これはメンバ変数であることを分かりやすくするための慣例です。
付けなくてもエラーにはなりませんが、こうすることで後々プログラムの中身が追いやすくなりますので、面倒かもしれませんが付加しておくことをオススメしています。
今回定義したメンバ変数には、画面から入力したIDとパスワード保存するためのファイル名を格納しています。
コンストラクタ
クラス名と同じ名前のメソッドがありますが、これはコンストラクタと呼ばれるもので、プログラムの起動時、最初に1回だけ実行されます。
ここに
InitializeComponent();
とう1行がありますが、これは画面に置かれたコントロール類に初期値を設定し、画面を描画するメソッドです。
このメソッドの中身は別ファイル(MainForms.Designer.cs)に記述されていて、レイアウトエディタでレイアウトを変更するたび、Visual Studio が自動的に変更結果を反映しています。
1 2 3 4 5 6 7 8 9 10 |
/// <summary> /// 画面に配置するコントロールの登録と初期化 /// </summary> public MainForm() { InitializeComponent(); //プログラムを画面の真ん中に表示 this.StartPosition = FormStartPosition.CenterScreen; } |
次に
this.StartPosition = FormStartPosition.CenterScreen;
と記載していますが、これは画面を表示するとき、モニタ上のどこに表示するかを指定するものです。
this は MainForm クラスの事で、そのクラスが持つ StartPosition というプロパティに、スクリーン(画面)の中心を表す FormStartPosition.CenterScreen という値を指定しています。
メンバ変数とMainFormの初期表示位置を設定しよう
では、実際にコードを入力していきましょう。
ファイル名を格納するメンバ変数と、MainFormの初期表示位置について、所定の位置に記述して下さい。
private string _idPassFile = “IdPass.xml”;
this.StartPosition = FormStartPosition.CenterScreen;

1 |
まとめ
如何でしたでしょうか。
今回は、Visual Studio が自動生成してくれる冒頭部分のソースコードを中心に
- using
- namespace
- クラス名
- メンバ変数
- コンストラクタ
について解説致しました。
ちょっと難しかったかもしれませんが、プログラミングを進めていくうちに、だんだんと実感として分かっていくと思いますので、ここで全てを理解する必要はありません。
次回は、イベントハンドラの部分を細かく解説していきます。