应用程序设置中的StringCollection不会被存储

时间:2011-07-02 13:37:07

标签: c# string collections application-settings

我想使用StringCollection作为应用程序设置,但是在阅读它不是问题时,我发现没有存储设置。

如何使它有效?任何解决方法?这有什么问题?

我正在使用的代码:

    private static void AddToRecentProfiles(string path)
    {
        if (SpellCaster3.Properties.Settings.Default.RecentProfiles == null) 
            SpellCaster3.Properties.Settings.Default.RecentProfiles = new StringCollection();

        int index = SpellCaster3.Properties.Settings.Default.RecentProfiles.IndexOf(path);
        if (index >= 0)
            SpellCaster3.Properties.Settings.Default.RecentProfiles.Swap(index, 0);
        else
            SpellCaster3.Properties.Settings.Default.RecentProfiles.Insert(0, path);

        if (SpellCaster3.Properties.Settings.Default.RecentProfiles.Count > SpellCaster3.Properties.Settings.Default.MaxRecentProfiles)
            SpellCaster3.Properties.Settings.Default.RecentProfiles.RemoveAt(SpellCaster3.Properties.Settings.Default.RecentProfiles.Count - 1);

        SpellCaster3.Properties.Settings.Default.Save();

        OnRecentProfilesChanged(SpellCaster3.Properties.Settings.Default.RecentProfiles, EventArgs.Empty);
    }

3 个答案:

答案 0 :(得分:10)

我自己找到了解决方案,问题是如果使用“new”关键字创建StringCollection并保存设置,则不会存储它们。

解决此问题的方法是“强制”应用程序设置设计人员为您创建它,如何做到这一点?好吧,这很简单,把stringcollection作为类型并插入2/3字符串。按确定。然后再次编辑此值并删除所有字符串,使其“创建但空”。

在此之后,您可以通过添加/删除字符串并保存设置来使用它。你肯定它不会是空的!

答案 1 :(得分:4)

Application settings可以在应用程序级别和用户级别进行作用,您只能在用户级别写入设置,因此如果您在应用程序级别有StringCollection作用域,则只能读取您在编译时定义的值,并且在下次启动应用程序时,在运行时添加到集合将不起作用。

如果希望更改在应用程序运行之间传播,则可以在用户级别进行范围调整。

答案 2 :(得分:0)

发生这种情况的另一个原因是,如果您认为存储 StringCollection 而不是每次都调用该属性是个好主意。

例如,我所做的就是为了为此类设置创建抽象基础:

public class RecentFilePropertyRepository
{
    private readonly StringCollection collection = RecentFiles.Default.MostRecentFiles;

    public StringCollection MostRecentFiles => collection;

    public void Save()
    {
        RecentFiles.Default.Save();
    }
}

由于某种我不知道的原因,从我的属性更新 StringCollection 导致保存了第一个更新。

我要么不得不在 RecentFiles.Default.MostRecentFiles = collection; 之前调用 Save(),要么修改我的属性以调用“原始”属性:

public StringCollection MostRecentFiles => RecentFiles.Default.MostRecentFiles;

在内部设置文件返回这样的列表

return ((global::System.Collections.Specialized.StringCollection)(this["MostRecentFiles"]));

索引器调用可能有一些我不知道的含义。

无论如何,我知道这不是 Francesco 的问题,但如果任何其他可怜的人遇到同样的问题,那可能会有所帮助。