- PR -

Listを、アプリケーションの設定として保存する方法(VC#2005)

1
投稿者投稿内容
mosco
会議室デビュー日: 2008/01/28
投稿数: 2
投稿日時: 2008-01-28 17:18
WindowsアプリケーションをC#(VS2005)で作成しております。

このアプリケーションでは設定項目が多いため、Settings()機能を使用して
初期値を保存することを考えているのですが、型がList<自作クラス>の項目で
設定値を保存できません。
たとえば、設定項目として既存のSettingsクラスに
・List<string> myTestStrList
・List<MyTestClass> myTestClassList
を追加し、各々に値を格納してProperties.Settings.Default.Save()したのですが、
myTestStrListの値は保存されるのに、myTestClassListの値を保存できない
(user.configに反映されない)のです。
初めてこの機能を使うということもあり、どうにも行き詰ってしまいました。
何かアドバイスいただけたら幸いです。よろしくお願い致します。

以下、テストで作成しましたソースです。
button0をクリックし一度フォームを閉じ、再度フォームを開いた場合、
button1クリックで「string1」を取得することはできますが、
button2クリックで「string2」を取得することができません(Null参照エラー)
*****************
//フォーム
public partial class Form1 : Form{
◆button0_Clickイベント
//List<string>型の項目の初期値をセット
List<string> tempStrList = new List<string>();
tempStrList.Add("string1");
Properties.Settings.Default.myTestStrList = tempStrList;
//List<自作クラス>型の項目の初期値をセット
List<MyTestClass> tempClassList = new List<MyTestClass>();
MyTestClass tempClass1 = new MyTestClass();
tempClass1.Parts1 = "string2";
tempClass1.Parts2 = 999;
tempClassList.Add(tempClass1);
Properties.Settings.Default.myTestClassList = tempClassList;
//Save()で値を保存
Properties.Settings.Default.Save();

◆button1_Clickイベント
textBox1.Text = Properties.Settings.Default.myTestStrList[0];

◆button2_Clickイベント
textBox2.Text = Properties.Settings.Default.myTestClassList[0].Parts1;
}

//自作クラス(テストのためプロパティは2つ)
[Serializable]
class MyTestClass {
public string Parts1;
public int Parts2;
}

//プロジェクト直下のSettings.cs
internal sealed partial class Settings {
◆class内に以下の通り追記
// 設定項目1
[global::System.Configuration.UserScopedSettingAttribute()]
public System.Collections.Generic.List<string> myTestStrList {
get { return ((System.Collections.Generic.List<string>)(this["myTestStrList"])); }
set { this["myTestStrList"] = value; }
}

// 設定項目2
[global::System.Configuration.UserScopedSettingAttribute()]
public System.Collections.Generic.List<MyTestClass> myTestClassList {
get { return ((System.Collections.Generic.List<MyTestClass>)(this["myTestClassList"])); }
set { this["myTestClassList"] = value; }
}
}
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-01-29 07:45
実装はいらないので、List<MyTestClass>を継承したクラスを作り、それと差し替えてみてください。
バグか仕様かわからないのですが、List<>をシリアライズすることができません。そのためだと思います。
実装はいりませんが、シリアル化可能の属性は付けてくださいね。

(ブログか記事で書いたような気がする)
よこけん
大ベテラン
会議室デビュー日: 2006/01/31
投稿数: 216
投稿日時: 2008-01-29 12:53
MyTestClass の可視性を public にしたらできましたよ。
_________________
C#と諸々
mosco
会議室デビュー日: 2008/01/28
投稿数: 2
投稿日時: 2008-01-29 15:57
レスどうもありがとうございました。

>よこけん様
ご指摘の通りに変更したところ、こちらでも保存ができることを確認致しました。
アクセスレベルとは気付かず、全く見当違いのところで悪戦苦闘しておりました(お恥ずかしいです)。
本当に助かりました。

>Jitta様
HP、いつも参考にさせていただいてます。
今回はアクセスレベル変更で解決しましたが、開発を続けていく中でまた保存できない問題が起こった時には
シリアライズの件も試してみます。

まだヒヨコなのでまた質問を投稿することもあるかと思いますが、
今後ともどうぞよろしくお願い致します。
1

スキルアップ/キャリアアップ(JOB@IT)