- - PR -
Listを、アプリケーションの設定として保存する方法(VC#2005)
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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; } } } |
|
投稿日時: 2008-01-29 07:45
実装はいらないので、List<MyTestClass>を継承したクラスを作り、それと差し替えてみてください。
バグか仕様かわからないのですが、List<>をシリアライズすることができません。そのためだと思います。 実装はいりませんが、シリアル化可能の属性は付けてくださいね。 (ブログか記事で書いたような気がする) |
|
投稿日時: 2008-01-29 12:53
MyTestClass の可視性を public にしたらできましたよ。
_________________ C#と諸々 |
|
投稿日時: 2008-01-29 15:57
レスどうもありがとうございました。
>よこけん様 ご指摘の通りに変更したところ、こちらでも保存ができることを確認致しました。 アクセスレベルとは気付かず、全く見当違いのところで悪戦苦闘しておりました(お恥ずかしいです)。 本当に助かりました。 >Jitta様 HP、いつも参考にさせていただいてます。 今回はアクセスレベル変更で解決しましたが、開発を続けていく中でまた保存できない問題が起こった時には シリアライズの件も試してみます。 まだヒヨコなのでまた質問を投稿することもあるかと思いますが、 今後ともどうぞよろしくお願い致します。 |
1