DOBON.NET DOBON.NETプログラミング掲示板過去ログ

WPFのProperties.Settings.Defaultで保存されない現象について

環境/言語:[OS:Windows Vista 開発環境:Visual Studio 2010, .NET 4.0, C#, WPF]
分類:[.NET]

いつも参考にさせてもらっています。

 WPFでアプリケーションを作っているのですが、アプリケーションの設定が正しく保存されなくて困っています。行いたいことは、アプリケーションの初回起動時に、設定の初期化処理を行うことです。
 Visual Studio 2010 でソリューションエクスプローラーの“プロジェクト名”を右クリック、「プロパティ」の「設定」タブで以下の項目を追加しています。

型                 名前       スコープ  値
bool               IsSettingEnable   ユーザー  False
System.Collections.Hashtable   HashT        ユーザー


 そして、以下のようなプログラムを実行しています。

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            
            

            if (!Properties.Settings.Default.IsSettingEnable)
            {
                Properties.Settings.Default.HashT = new System.Collections.Hashtable();
                Properties.Settings.Default.HashT.Add("foo","hoge");
                Properties.Settings.Default.IsSettingEnable = true;

                Properties.Settings.Default.Save();                
            }

            if (Properties.Settings.Default.IsSettingEnable && 
                   Properties.Settings.Default.HashT != null)
                MessageBox.Show("HashTの中身はnullではありません");

        }
    }


 簡単に説明すると、アプリケーション初回起動時にHashTを初期化してIsSettingEnableをtrueにして設定有効フラグを立てます。そして、次回に起動するときにHashTの中身がnullでなければ確認のメッセージを表示します。
 このプログラムを実行すると、2回目以降の起動時に、MessageBoxが表示されません。つまり、初期化したはずのHashTがnullになってしまっているのです。

 bool型やstring型などは正常に保存されるのですが、HashTableやXDocumentなどは保存されずにnullになってしまいます。

 
 いろいろ調べたつもりなのですが、良いページを見つけられませんでした。この現象について、ぜひご意見をいただけたらと思います。

 どうかよろしくお願いします。
文字列にシリアル化できないオブジェクトは保存できないということが原因でしょう。

Hashtableを保存できるようにする例が、

.net - How to store a HashTable in the usersettings? - Stack Overflow
http://stackoverflow.com/questions/1775246/how-to-store-a-hashtable-in-the-usersettings

にありましたので、参考にしてください。
回答ありがとうございます。

「設定」の項目の「型」から選択できる項目は、すべて保存されるものと思っていましたがそうではないのですね。最初はDictionaryが使いたくてリストから探したのですが、無いので代わりにリストに存在するHashtableを使おうとしていました。

当初の目的は、二つの値を関連付けて保存することだったので結局、こちらのサイトの以下のページに掲載されている方法を使ってListを使用可能にして、自作クラスを格納するようにしました。

http://dobon.net/vb/dotnet/programing/mysettings.html

はじめからこの方法を取っていればお手を煩わせることもなかったかもしれません。申し訳ないです。

ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板