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.To​String());
}

IsCheckedboolを返すだけのプロパティなので、ラベル表示にもファイル保存にも同じ値をそのまま使い回せます。ここは設計を変える必要はありません。

手を加える必要が出てくるケース

次のような場合は、前回のコードだけでは足りません。

①アプリ再起動後に、保存した状態をチェックボックスへ復元したい

IsCheckedgetしかないので、ファイルから読み込んだ値を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"));
    }
}

②チェック状態が変わるたびに自動保存したい(ボタン操作を待たない)

この場合はcheckBox1CheckedChangedイベントで保存処理を呼ぶ形になります。

private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
    File.WriteAllText("checkstate.txt", checkBox1.Checked.To​String());
}

③保存項目が複数に増える予定がある

チェックボックス以外の設定も含めて保存したくなった場合、boolを直書きするより、JSON化したクラス(設定用のモデルクラス)を用意してSystem.Text.Jsonで読み書きする形にしておくと、あとで項目が増えても崩れにくくなります。

まとめ

やりたいこと前回のコードで足りるか
ボタン押下時の状態を1回ファイルに書き出す○ そのままでOK
アプリ再起動時に状態を復元する△ セッターの追加が必要
チェック変更のたびに自動保存する△ CheckedChangedイベントの追加が必要
保存項目が今後増える見込み△ JSON化した設定クラスを検討

「今後どこまで発展させたいか」によって必要な変更が変わってきます。再起動後の復元まで見込んでいるなら、最初からセッター付きのプロパティにしておくのがおすすめです。

訪問数 4 回, 今日の訪問数 4回

広告