2012-06-16 17 views
6

Ben kullanıcı ayarları için özel sınıf kurtarmaya çalışırken ama çok başarı olmayacağım.nasıl ApplicationSettingsBase kullanarak kullanıcı ayarlarına özel bir sınıf kaydederim?

Ben Hedef çerçevesi ile Visual Studio 2010 bir test projesi oluşturduk =" .NET Framework 4" . Ana formun, özel bir sınama dizesi ve "Başlık" alanını özel sınıfımdan görüntülemek ve düzenlemek için iki metin kutusu vardır; Ayarları yüklemek ve kaydetmek için iki düğmeyle birlikte.

Son olarak, "TestString" (bir düz dize değeri) ve TestData (MyDataClass türü) olmak üzere iki ayar ekledim. Bunu, Type açılır listesinden "Gözat ..." ı seçerek daha sonra projenin Properties.Settings sekmesinde yaptım el ile mevcut tür listesinde görünmediği gibi "Seçili Tip" kutusuna "MyUserSettingsTest.MyDataClass" girerek el ile girer ancak sonradan yapar.)

Uygulamayı başlatıp LoadSettings'i tıklattığınızda olay işleyicisi düzlemi yükler. dize ve MyData veya bu başarısız olursa, yeni bir MyDataClass örneği oluşturur. Daha sonra düz dizeyi ve test verilerini Başlık üzerinde düzenleyebilir ve SaveSettings'i tıklayabilirim. Sonra ise değerler her iki değerler için beklendiği gibi yine geçen kaydedilen değerler geri yüklenir LoadSettings tıklayın yeniden düzenleyin. Çok uzak çok iyi.

Sorun, uygulamadan çıkılırken ve yeniden başlatıldığında düz sınama dizesinin tamamen geri yüklendiğinden ancak MyData nesnesinin değil! Açıkçası, kod, MyData'nın belleğe devam etmesini sağlıyor, ancak kalıcı mağazaya gitmiyor mu?

ana form kodudur:

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(); 
     } 
    } 
} 

Benim test veri sınıfı kodu: Bu yardım ancak eğer

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; } 
     } 
    } 
} 

Bilmiyorum otomatik olarak oluşturulmuş app.config dosyası (TestString ayarını içerir ama TestData DEĞİLDİR?):

<?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> 

Otomatik oluşturulan Settings.Designer.cs dosyasıdır:

//------------------------------------------------------------------------------ 
// <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; 
     } 
    } 
} 
} 

kimse yanlış yapıyorum veya düzgün kullanıcı ayarlarına devam etmek benim özel bir sınıf almak için yapmanız gereken ekstra ne olduğunu bana söyleyebilir edin.

cevap

1

dizgeleştirilmiş olarak özel nesneyi kaydedin. O zaman sadece bir dizgeyi saklamanız gerekir. Örneğin, nesneleri serileştirmek ve serileştirmek için Json .NET JsonConverter kullanın.

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

Sonra O tekerleği yeniden tanımlamak için çalışırken çok daha basit olan bu

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

gibi geri okuyabiliyordu. Gibi uzun bir liste kısa olduğu için o tamam olmalıdır :) Bu kesinlikle benim için çalışıyor çok çok basit, teşekkür ederim! –

İlgili konular