C#/WinForms チェックボックスの状態をファイルに保存するには?読み取り専用プロパティの限界と対処法
前回は、Form1のボタンでForm2のチェックボックス状態を取得し、ラベルに表示する方法を解説しました。Form2側に読み取り専用プロパティIsCheckedを用意し、カプセル化を保ったまま状態を取得する設計でした。
今回はその発展編として、「このチェックボックスの状態を将来ファイルに保存したい」場合に、前回のコードのままで足りるのか、手を加える必要があるのかを整理します。
そのままで足りるケース
「ボタンを押した瞬間の状態をファイルに書き出す」だけなら、IsCheckedを使ってそのまま書き込むだけで済みます。
private void button1_Click(object sender, EventArgs e)
{
label1.Text = form2.IsChecked ? "チェックあり" : "チェックなし";
// ファイルに保存する場合
File.WriteAllText("checkstate.txt", form2.IsChecked.ToString());
}
IsCheckedはboolを返すだけのプロパティなので、ラベル表示にもファイル保存にも同じ値をそのまま使い回せます。ここは設計を変える必要はありません。
手を加える必要が出てくるケース
次のような場合は、前回のコードだけでは足りません。
①アプリ再起動後に、保存した状態をチェックボックスへ復元したい
IsCheckedはgetしかないので、ファイルから読み込んだ値をcheckBox1.Checkedに戻す手段がありません。この場合はセッターも用意します。
public bool IsChecked
{
get => checkBox1.Checked;
set => checkBox1.Checked = value;
}
そしてForm2のコンストラクタかLoadイベントでファイルを読み込んで反映します。
private void Form2_Load(object sender, EventArgs e)
{
if (File.Exists("checkstate.txt"))
{
checkBox1.Checked = bool.Parse(File.ReadAllText("checkstate.txt"));
}
}
②チェック状態が変わるたびに自動保存したい(ボタン操作を待たない)
この場合はcheckBox1のCheckedChangedイベントで保存処理を呼ぶ形になります。
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
File.WriteAllText("checkstate.txt", checkBox1.Checked.ToString());
}
③保存項目が複数に増える予定がある
チェックボックス以外の設定も含めて保存したくなった場合、boolを直書きするより、JSON化したクラス(設定用のモデルクラス)を用意してSystem.Text.Jsonで読み書きする形にしておくと、あとで項目が増えても崩れにくくなります。
まとめ
| やりたいこと | 前回のコードで足りるか |
|---|---|
| ボタン押下時の状態を1回ファイルに書き出す | ○ そのままでOK |
| アプリ再起動時に状態を復元する | △ セッターの追加が必要 |
| チェック変更のたびに自動保存する | △ CheckedChangedイベントの追加が必要 |
| 保存項目が今後増える見込み | △ JSON化した設定クラスを検討 |
「今後どこまで発展させたいか」によって必要な変更が変わってきます。再起動後の復元まで見込んでいるなら、最初からセッター付きのプロパティにしておくのがおすすめです。




ディスカッション
コメント一覧
まだ、コメントがありません