Я пытаюсь сохранить пользовательский класс в пользовательских настройках, но не имея большого успеха.Как сохранить пользовательский класс в пользовательских настройках с помощью ApplicationSettingsBase?
Я создал тестовый проект в Visual Studio 2010 с Target framework = ".NET Framework 4". Основная форма имеет два текстовых поля для отображения и редактирования простой тестовой строки и поля «Заголовок» из моего пользовательского класса; вместе с двумя кнопками для загрузки и сохранения настроек.
Наконец, я добавил две настройки «TestString» (простое строковое значение) и TestData (тип MyDataClass - я сделал это на вкладке Properties.Settings проекта, выбрав «Browse ...» в раскрывающемся списке Type, затем вручную вводя «MyUserSettingsTest.MyDataClass» в поле «Выбранный тип», поскольку он изначально не появлялся в списке доступных типов, но затем впоследствии он делает.)
При запуске приложения и нажатии LoadSettings обработчик событий загружает обычную string и MyData или, если это не удается, создается новый экземпляр MyDataClass. Затем я могу отредактировать простую строку и тестовые данные в форме и нажать SaveSettings. Если я затем повторно отредактирую значения, щелкните LoadSettings снова, последние сохраненные значения будут восстановлены как ожидалось для обоих значений. Все идет нормально.
Проблема в том, что при выходе из приложения и повторном запуске простая тестовая строка восстанавливается нормально, но объект MyData не является! Очевидно, что код сохраняет MyData в памяти в порядке, но не в постоянном хранилище?
Основной формой код:
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();
}
}
}
Мой тестовый код класса данных:
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 (который содержит настройки для TestString, но NOT 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;
}
}
}
}
Пожалуйста, может кто-нибудь сказать мне, что я делаю неправильно или что дополнительные мне нужно сделать, чтобы получить свой собственный класс, чтобы сохраняться в настройках пользователя правильно.
Это гораздо проще, чем пытаться заново изобретать колесо. Пока список короткий, он должен быть в порядке :) Это определенно работает для меня так, спасибо, так просто! –