【问题标题】:C# Custom user settings class not savingC#自定义用户设置类不保存
【发布时间】:2010-12-01 06:24:54
【问题描述】:

我有以下课程:

[Serializable]
[XmlRoot ( ElementName = "TextData", IsNullable = false)]
public class TextData
{
    private System.Drawing.Font fontColor;

    [XmlAttribute ( AttributeName = "Font" )]
    public System.Drawing.Font Font { get; set; }

    [XmlAttribute ( AttributeName = "FontColor" )]
    public System.Drawing.Color FontColor { get; set; }

    [XmlAttribute ( AttributeName = "Text" )]
    public string Text { get; set; }

    public TextData ( )
    {
    } // End of TextData
} // End of TextData

我试图用以下代码保存它:

    // Create our font dialog
    FontDialog fontDialog = new FontDialog ( );
    fontDialog.ShowColor = true;

    // Display the dialog and check for an ok
    if ( DialogResult.OK == fontDialog.ShowDialog ( ) )
    {
        // Save our changes for the font settings
        if ( null == Properties.Settings.Default.MainHeadlineTextData )
        {
            Properties.Settings.Default.MainHeadlineTextData = new TextData ( );
        }
        Properties.Settings.Default.MainHeadlineTextData.Font = fontDialog.Font;
        Properties.Settings.Default.MainHeadlineTextData.FontColor = fontDialog.Color;
        Properties.Settings.Default.Save ( );
    }

每次我加载应用程序时,Properties.Settings.Default.MainHeadlineTextData 仍然为空。保存似乎没有生效。我在另一篇文章中读到该课程必须是公开的,而且确实如此。任何想法为什么这不能正常工作?

【问题讨论】:

  • 什么时候加载数据? 那个代码是什么样的?
  • 设置通过 .Net 框架自动加载。

标签: c# settings


【解决方案1】:
  • 请注意,如果您完全重新编译应用程序,则会在内部获取一个新版本,因此它会在另一个文件夹中查找设置 - 当然会找不到并创建一个新的默认设置。
  • 保存数据时没有抛出异常?
  • 如果在 TextData 构造函数中插入断点,它会在应用程序加载时调用吗?

【讨论】:

    【解决方案2】:

    它不起作用,因为 Color 和 Font 不是 xml-serializable。 更重要的是,Font 没有无参数构造函数,因此 Settings.Save() 无法序列化您的对象并且不保存任何内容。

    不幸的是,默认情况下,SettingsBase 类下的基础架构(您的 Settings 类继承自该基础架构 - 请参阅 Settings.Designer.cs 中的自动生成代码 em> 文件)不会在序列化错误时抛出异常,因此您看不到问题。

    从您的类中删除 Font 和 Color 属性,然后重试。

    另一种解决方案

    另一种解决方案是使用二进制序列化。 打开 Settings.Designer.cs 文件并将属性 [SettingsSerializeAs(SettingsSerializeAs.Binary)] 添加到属性 Settings.MainHeadlineTextData

    【讨论】:

    • 谢谢。在您的帮助下,我将 [XmlIgnore] 添加到字体和颜色选项中,并使用了来自devblog.antongochev.net/2008/06/26/… 的一些序列化代码来使其正常工作。
    • SettingsSerializeAs.Binary 效果很好,但我发现如果设计器用于添加新设置,我需要再次添加属性。
    【解决方案3】:

    要将类保存到应用程序设置配置文件中,该类必须支持 TypeConverter 或 XMLSerializable。

    您的代码没有为您的自定义类实现 TypeConverter,并且 Color 和 Font 类不是 XMLSeraliable。

    如何实现类型转换器: http://msdn.microsoft.com/en-us/library/ayybcxe5%28VS.80%29.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-10
      • 2010-10-08
      • 1970-01-01
      • 1970-01-01
      • 2016-01-21
      • 1970-01-01
      • 2014-03-04
      • 2017-03-13
      相关资源
      最近更新 更多