2012-06-16 37 views
6

カスタムクラスをユーザー設定に保存しようとしていますが、あまり効果がありません。ApplicationSettingsBaseを使用してカスタムクラスをユーザー設定に保存するにはどうすればよいですか?

ターゲットフレームワーク= ".NET Framework 4"でVisual Studio 2010でテストプロジェクトを作成しました。メインのフォームには、プレーンなテスト文字列を表示および編集するための2つのテキストボックスと、カスタムクラスの「タイトル」フィールドがあります。設定をロードして保存する2つのボタンがあります。

最後に、 "TestString"(プレーンな文字列値)とTestData(MyDataClassのタイプ)の2つの設定を追加しました。これはプロジェクトのProperties.Settingsタブでタイプドロップダウンリストから "Browse ..."手動で「選択されたタイプ」ボックスに「MyUserSettingsTest.MyDataClass」と入力してください。これは最初は使用可能なタイプリストには表示されませんでしたが、その後はそれが使用されます)。

アプリケーションを起動してLoadSettingsをクリックすると、 MyDataClassの新しいインスタンスを作成します。フォーム上のプレーンストリングとテストデータのタイトルを編集し、SaveSettingsをクリックします。値を再編集するとLoadSettingsをもう一度クリックすると、最後に保存された値が両方の値に対して予期したとおりに復元されます。ここまでは順調ですね。

問題は、アプリケーションを終了して再起動すると、プレーンなテスト文字列が正常に復元されますが、MyDataオブジェクトが復元されないことです。明らかに、コードはMyDataをメモリに保存していますが、永久ストアには保存していません。それは助けになるかどうかはわからない

using System.Configuration; 

namespace MyUserSettingsTest 
{ 
    public class MyDataClass : ApplicationSettingsBase 
    { 
     public MyDataClass() 
     { 
     } 

     private int _id; 
     private string _title; 

     [UserScopedSetting()] 
     [SettingsSerializeAs(SettingsSerializeAs.Xml)] 
     public int ID 
     { 
      get { return _id; } 
      set { _id = value; } 
     } 

     [UserScopedSetting()] 
     [SettingsSerializeAs(SettingsSerializeAs.Xml)] 
     public string Title 
     { 
      get { return _title; } 
      set { _title = value; } 
     } 
    } 
} 

が、自動生成されたapp.configファイル:

using System; 
using System.Windows.Forms; 

namespace MyUserSettingsTest 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     public MyDataClass MyData {get;set;} 

     private void loadSettingsButton_Click(object sender, EventArgs e) 
     { 
      this.myTextBox.Text = Properties.Settings.Default.TestString; 
      this.MyData = Properties.Settings.Default.TestData; 

      if (this.MyData == null) 
      { 
       this.MyData = new MyDataClass() { ID = 1, Title = "Default New Title" }; 
      } 

      this.myDataTitleTextBox.Text = this.MyData.Title; 
     } 

     private void saveSettingsButton_Click(object sender, EventArgs e) 
     { 
      this.MyData.Title = this.myDataTitleTextBox.Text; 

      Properties.Settings.Default.TestString = this.myTextBox.Text; 
      Properties.Settings.Default.TestData = this.MyData; 
      Properties.Settings.Default.Save(); 
     } 
    } 
} 

私のテストデータクラスのコードは次のとおりです。

メインフォームのコードがあります(これにはTestStringの設定が含まれていますが、TestDataの設定はありません)?

<?xml version="1.0"?> 
<configuration> 
    <configSections> 
     <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
      <section name="MyUserSettingsTest.Properties.Settings"  type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false"/> 
     </sectionGroup> 
    </configSections> 
    <userSettings> 
     <MyUserSettingsTest.Properties.Settings> 
      <setting name="TestString" serializeAs="String"> 
       <value/> 
      </setting> 
     </MyUserSettingsTest.Properties.Settings> 
    </userSettings> 
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration> 

自動生成されたSettings.Designer.csファイルは次のとおりです。

//------------------------------------------------------------------------------ 
// <auto-generated> 
//  This code was generated by a tool. 
//  Runtime Version:4.0.30319.269 
// 
//  Changes to this file may cause incorrect behavior and will be lost if 
//  the code is regenerated. 
// </auto-generated> 
//------------------------------------------------------------------------------ 

namespace MyUserSettingsTest.Properties { 


[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.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("")] 
    public string TestString { 
     get { 
      return ((string)(this["TestString"])); 
     } 
     set { 
      this["TestString"] = value; 
     } 
    } 

    [global::System.Configuration.UserScopedSettingAttribute()] 
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 
    public global::MyUserSettingsTest.MyDataClass TestData { 
     get { 
      return ((global::MyUserSettingsTest.MyDataClass)(this["TestData"])); 
     } 
     set { 
      this["TestData"] = value; 
     } 
    } 
} 
} 

誰もが私が間違ってやっているか、私は適切にユーザーの設定に永続化するために私のカスタムクラスを取得するために何をする必要があるか、余分な私に言うことができるしてください。

答えて

1

カスタムオブジェクトをシリアル化された文字列として保存します。次に、文字列を格納するだけです。たとえば、Json .NET JsonConverterを使用してオブジェクトを直列化および逆シリアル化します。

Properties.Settings.Default.TestData = JsonConvert.SerializeObject<MyDataClass>(this.MyData); 

その後、あなたはそれは、車輪を再定義しようとしているよりもはるかに簡単です。この

this.MyData = JsonConvert.DeserializeObject<MyDataClass>(Properties.Settings.Default.TestData); 
+1

ようにそれを読み戻すことができます。リストが短い限り、それは問題ないはずです:)これは間違いなく私のために働いていますので、とても簡単です! –

関連する問題