Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# Custom user settings class not saving

Tags:

c#

settings

I have the following class:

[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

And Im attempting to save it with the following code:

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

Everytime I load the the application, the Properties.Settings.Default.MainHeadlineTextData is still null. Saving does not seem to take effect. I read on another post that the class must be public and it is. Any ideas why this would not be working properly?

like image 618
Kyle Avatar asked Sep 24 '09 22:09

Kyle


3 Answers

It doesn't work because Color and Font are not xml-serializable. Even more than that, Font does not have parameterless constructor so Settings.Save() fails to serialize your object and doesn't save anything.

Unfortunately, by default infrastructure under class SettingsBase (from which your Settings class is inherited - see auto-generated code in Settings.Designer.cs file) doesn't throw exception on serialization error so you can't see the problem.

Remove Font and Color properties from your class and try again.

Another solution

Another solution is to use binary serialization. Open Settings.Designer.cs file and add attribute [SettingsSerializeAs(SettingsSerializeAs.Binary)] to the property Settings.MainHeadlineTextData.

like image 188
Konstantin Spirin Avatar answered Nov 14 '22 21:11

Konstantin Spirin


To save classes to the application settings config file, the class must either support a TypeConverter or be XMLSerializable.

Your code does not implement a TypeConverter for your custom class, and the Color and Font classes are not XMLSerialiable.

How to implement a type converter: http://msdn.microsoft.com/en-us/library/ayybcxe5%28VS.80%29.aspx

like image 24
tbergelt Avatar answered Nov 14 '22 22:11

tbergelt


  • Note, that if you do a full recompile the application get a new version internally so it is looking in another folder for the settings - and will of course find none and create a new default one.
  • When you save the data, no exceptio is thrown?
  • If you insert a breakpoint into the TextData constructor, is it called on application load?
like image 42
codymanix Avatar answered Nov 14 '22 22:11

codymanix