

C#のApp.configについての質問です。  
アプリを立ち上げたときに、App.configからドロップダウンリスト1のデータおよび、その他のドロップダウンリスト2のデータを読み取りたいと思っています。また、keyとそのvalueは後に使用するので、まだ実装していませんが、App.configから読み込むときに、配列もしくはリストに格納しようと考えています。

App.configにデータを追加することで、ユーザはプログラムをいじることなく、ドロップダウンリストのリストや、その他のドロップダウンリストのリストを増やせるようにしたいと考えています。  
現在は、foreachで全てを読み込むというプログラムをしようと考えていますが、  
そうなった際にドロップダウンリスト1に使用するデータとドロップダウンリスト2に使用するデータをどのように分けたらよいか、というのが質問です。  
宜しくお願い致します。

class1↓

[code]

    private void Form1_Load(object sender, EventArgs e)
        {
            //すべてのキーとその値を取得(本当はcomboBox1と2で分けたい)
            foreach (string key in System.Configuration.ConfigurationSettings.AppSettings.AllKeys)
            {
                //key=a,bがcomboBox1
                comboBox1.Items.Add(System.Configuration.ConfigurationSettings.AppSettings[key]);
                //配列に格納する機能未実装
    
                //key=AB,CDがcomboBox2
                comboBox2.Items.Add(System.Configuration.ConfigurationSettings.AppSettings[key]);
                //配列に格納する機能未実装
            }
        }
    
[/code]

App.config↓

[code]

     <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <startup> 
            <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
        </startup>
      <appSettings>
    　　　　//リスト1
        <add key="a" value="1"/>
        <add key="b" value="2"/>
        //ユーザはここにどんどん追加
        //リスト2
        <add key="AB" value="3"/>
        <add key="CD" value="4"/>
        //ユーザはここにどんどん追加
      </appSettings>
    </configuration>
    
[/code]


CC BY-SA 3.0
2017-03-26T15:10:29.943
33555
2017-03-26T22:30:10.907
19213
question
c# アルゴリズム
C# App.configのデータ取得について


方針としては

  1. `<appSettings>`のキー名に条件を付けて区別する
  2. 特定の1つのキーの値にすべての値を登録する
  3. 専用の型を用意し、XMLとしてシリアライズする

などが考えられます。

1.の場合、たとえばキーの名前を`List1_a`や`List2_AB`のように変更し、`key.StartsWith("List1_")`のような条件を追加します。キー名は`key.Substring(6)`で取得します。

2.では値としてたとえば

[code]

    <add key="list1" value="a:1;b:2" />
    <add key="list2" value="AB:3;CD:4" />
    
[/code]

のようにすべての項目を含む文字列を設定します。上記の例では`;`と`:`が区切りですが、制御文字や解析の手間を考えると`XML`や`JSON`で格納するのが簡単だと思います。

3.の場合、`<appSettings>`セクションではなく`Settings.settings`で生成される項目を使用します。  
まずプロジェクトのプロパティから「設定」を開き、適当なキー名を2個登録します。  
次に型を指定する必要がありますが、既定の型ではうまく行かないと思いますので適当な「クラスライブラリー」プロジェクトを別に用意し、たとえば下記のような型を作成します。

[code]

    public struct Entry
    {
        [XmlAttribute]
        public string Key { get; set; }
    
        [XmlText]
        public string Value { get; set; }
    }
    public sealed class EntryCollection : Collection<Entry>
    {
    }
    
[/code]

このプロジェクトをビルドし、`Settings.settings`を含むプロジェクトから参照すると「設定」の「型」の「参照」から上記の型が選択できます。

ここまで準備ををするとC#コードから

[code]

    EntryCollection entries = Settings.Default.キー1;
    if (entries != null)
    {
        foreach (Entry e in entries)
        {
            comboBox1.Items.Add(e.Value);
        }
    }
    
[/code]

のように参照できます。`app.config`の設定値は`userSettings`または`applicationSettings`に設定すればよく、

[code]

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
        <userSettings>
            <プロジェクト名.Properties.Settings>
                <setting name="キー1" serializeAs="Xml">
                    <value>
                        <ArrayOfEntry>
                            <Entry Key="a">1</Entry>
                            <Entry Key="b">2</Entry>
                        </ArrayOfEntry>
                    </value>
                </setting>
                <setting name="キー2" serializeAs="Xml">
                    <value>
                        <ArrayOfEntry>
                            <Entry Key="AB">3</Entry>
                            <Entry Key="CD">4</Entry>
                        </ArrayOfEntry>
                    </value>
                </setting>
            </プロジェクト名.Properties.Settings>
        </userSettings>
    </configuration>
    
[/code]

のようになります。

私としては`<appSettings>`の複数のキーを利用するやり方は想定外のキーが存在しうるのでお勧めできません。下の方法ほど型安全で堅実だと思います。


CC BY-SA 3.0
2017-03-26T16:08:43.913
33556
2017-03-26T16:08:43.913
5750
33555
answer


基本的にはpgrhoさんの回答の通りですが、Visual Studioには便利な機能がいくつか用意されていますので、その部分を紹介します。

まず、`Entry`クラス`EntryCollection`クラスを作らなくともSettings.settingsに`System.Collections.Specialized.StringCollection`が用意されていますのでこれを使うと楽です。これによって作成されるApp.configは

[code]

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <userSettings>
        <WindowsFormsApp1.Properties.Settings>
          <setting name="Key1" serializeAs="Xml">
            <value>
              <ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xmlns:xsd="http://www.w3.org/2001/XMLSchema">
                <string>1</string>
                <string>2</string>
              </ArrayOfString>
            </value>
          </setting>
        </WindowsFormsApp1.Properties.Settings>
      </userSettings>
    </configuration>
    
[/code]

となります（`Entry`でなく`string`になりますね）。

また、このコレクションを`ComboBox`に設定するには`DataSource`プロパティが使えます。

[code]

    comboBox1.DataSource = Settings.Default.Key1;
    
[/code]

ただしApp.configに記述されていない項目も追加する場合にはこの方法は使えず、１項目ずつ`Add`していく必要があります。


CC BY-SA 3.0
2017-03-26T22:30:10.907
33559
2017-03-26T22:30:10.907
4236
33555
answer