読者です 読者をやめる 読者になる 読者になる

Morning Girl

Windows, C#, .NET, Dynamics CRM etc..

【C#】Settingファイルの使い方

ユーザー固有の設定情報を保存する場合はどうすればいいのか? というなんとも初歩的なところがわからなかったので、色々と調べていました。

初めはある知識だけで、app.config改変できるんじゃね!? と思っていたら、 ConfigurationManagerクラスにそんな機能はなかったし、 そう言う風に使うものでもなかった。

(もちろんエンドユーザーが動的に書き換えることは考慮するとしても)

というわけで、プログラムの設定ファイルに保存・書き換えする方法があったので、実際にやってみる。

設定画面

あらかじめ、ソリューション→プロジェクト→プロパティ 設定画面でSettingファイルを作っておきます。

これによりNamespaceのSettingのファイルが生成され、メインのプログラムからアクセスすることができるようになります。

f:id:sugimomoto:20150405234058p:plain

設定できる項目は 名前・型・スコープ・値の4種類。 特に注意すべきなのは、スコープ。 スコープはアプリケーションレベルとユーザーレベルの2種類があり、ユーザーレベルでなければ書き換えができない模様。

作成すると下記のように【Settings.settings】と【Setting.Designer.cs】ファイルがプロジェクトの中に生成されます。

ぱっと見app.configをキャストする用に作ったクラスみたいな……。

//------------------------------------------------------------------------------
// <auto-generated>
//     このコードはツールによって生成されました。
//     ランタイム バージョン:4.0.30319.0
//
//     このファイルへの変更は、以下の状況下で不正な動作の原因になったり、
//     コードが再生成されるときに損失したりします。
// </auto-generated>
//------------------------------------------------------------------------------

namespace MyProject.SettingTest.Properties {
    
    
    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "12.0.0.0")]
    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
        
        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
        
        public static Settings Default {
            get {
                return defaultInstance;
            }
        }
        
        [global::System.Configuration.UserScopedSettingAttribute()]
        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [global::System.Configuration.DefaultSettingValueAttribute("TestTaro")]
        public string Name {
            get {
                return ((string)(this["Name"]));
            }
            set {
                this["Name"] = value;
            }
        }
        
        [global::System.Configuration.UserScopedSettingAttribute()]
        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [global::System.Configuration.DefaultSettingValueAttribute("27")]
        public int Age {
            get {
                return ((int)(this["Age"]));
            }
            set {
                this["Age"] = value;
            }
        }
    }
}

メインコード

ここまでやってしまえば、あとは出来たも同然で、知っているか知っていないかだけみたいな……。

基本的には 【Properties.Settings.Default."Setting項目名"】で各設定値にアクセス可能です。

値も上記プロパティに投げ入れて、 Properties.Settings.Default.Save()メソッドを実行するだけ。 (はじめSaveすることを知らなかったけど……。)

今回は現在の保存値の読み込み、書き換え、書き換えた値の読み込みを実施してみました。

using System;

namespace MyProject.SettingTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Start Setting Console!\n");

            Console.WriteLine("Setting Name : {0}", Properties.Settings.Default.Name);
            Console.WriteLine("Setting Age : {0}", Properties.Settings.Default.Age);

            Console.WriteLine("\nPlease Input Setting Name...");

            string x = Console.ReadLine().ToString();

            Properties.Settings.Default.Name = x;

            Properties.Settings.Default.Save();
            Console.WriteLine("save the configuration file is complete");

            Console.WriteLine("Setting Name : {0}", Properties.Settings.Default.Name);

            Console.ReadKey();
        }
    }
}

実行結果

f:id:sugimomoto:20150405234537p:plain

参考URL

https://msdn.microsoft.com/ja-jp/library/aa730869(v=vs.80).aspx

d.hatena.ne.jp