ソフラボの技術ブログ

仕事で使ったプログラミング、サーバー周りで役に立つこと、Webサービス開発に必要な技術情報、モバイル情報を書いてます。わかりやすく見やすくをモットーにしています。

C#のアプリケーション設定でプリンタ設定(PrinterSettings)を保存・読み込みできるようにする

C#でプリンターの設定(PrinterSettings)を保存する必要があったので、アプリケーション設定で保存するようしました。

しかし、アプリケーションが起動している最中は、設定の読み込み・保存が有効でも、アプリケーションを再起動すると設定が読み込まれない問題に遭遇しました。

いろいろ試した所、標準のやり方ではなく、手動でコードを書く必要があったのでその方法をまとめました。

手順

1.アプリケーション設定で通常通り設定を宣言している場合、削除します
f:id:shinsuke789:20170922101522p:plain

2.アプリケーション設定の上部にある「コードの表示」をクリックします
f:id:shinsuke789:20170922101525p:plain

3.設定用のコードが表示されるので、クラス内に設定名のプロパティで次のようなコードを追記します

[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Configuration.SettingsSerializeAsAttribute(SettingsSerializeAs.Binary)]
public PrinterSettings Printer
{
    get
    {
        return ((PrinterSettings)(this["Printer"]));
    }
    set
    {
        this["Printer"] = value;
    }
}

この場合は、PrinterSettingsという型で保存を行います。
プロパティ名・get/setの[]内には設定名を宣言します。

通常のアプリケーション設定で宣言するとXMLで保存され、それが読み込まれないので設定が復元できないようです。
それを回避するため、上記コードの2行目にある[global::System.Configuration.SettingsSerializeAsAttribute(SettingsSerializeAs.Binary)]を追加してバイナリで保存するようにします。

単純なプロパティのみのクラスで試した所、XML形式で保存され、読み込み・保存とも可能でした。
ひょっとすると一定の階層を超えると復元できないのかもしれません。

4.設定の読み込み・保存は通常通りのコードで可能です。

// 読み込み
PrinterSettings p = Settings.Default.Printer;

// 保存
Settings.Default.Printer = printerSettings;
Settings.Default.Save();

まとめ

stringやintと同じような形でPrinterSettingsを保存しようとして、1日ぐらい悩みました。
こういうときは一晩おくと冷静になって解決方法が見つかるんですよね。

そのおかけでなんとか解決することができました。

基本的にアプリケーション設定にない型を保存する場合は、手動でプロパティを宣言しバイナリで保存するようにした方が良いでしょう。

参考

調査していると、プリンターの設定方法を質問しているページがあったので参考にしました。
やはり同じようにアプリケーションを再起動すると読み込まれないと書かれています。

c# - how to Save PrintDocument .PrinterSettings in a file so that user have not to select printer settings everytime? - Stack Overflow

上記サイトは、base64に変換して保存・読み込みする方法でしたが、そんなことしなくてもバイナリ設定で解決です。

現場ですぐに使える!  VisualBasic 2015 逆引き大全 520の極意

現場ですぐに使える! VisualBasic 2015 逆引き大全 520の極意