Winforms - 动态加载/保存设置

时间:2008-10-14 13:50:52

标签: c# winforms dynamic settings

我的Winforms应用程序中有一个名为Settings.settings的“设置文件”,其中包含自定义方法的部分类等。有没有办法根据任意键加载/保存动态设置?

例如,我在我的应用程序中有一些ListViews,我想在其中保存/加载列宽;我没有为每个列表视图的每列创建宽度设置,而是想要一种自动加载/保存宽度的简单方法。

以下是我尝试过的保存方法的示例:

internal sealed partial class Settings
{
    public void SetListViewColumnWidths(ListView listView)
    {
        String baseKey = listView.Name;
        foreach (ColumnHeader h in listView.Columns)
        {
            String key = String.Format("{0}-{1}", baseKey, h.Index);
            this[key] = h.Width;
        }
    }
}

运行该代码时,我收到错误“未找到设置属性'TestsListView-0'。”我有什么遗漏?

3 个答案:

答案 0 :(得分:1)

将列宽设置存储在Xml Serializable对象中。即,实现IXmlSerializable的东西然后在Settings.settings中创建该类型的单个设置条目。

一个好的选择可能是Xml Serializable Dictionary。快速google search发现了很多不同的博客文章,描述了如何实现它。

如其他答案中所述,您需要确保此对象是用户设置。您可能还需要初始化设置实例。即,如果设置为null,则创建一个XmlSerializableDictionary()实例并将其分配给该设置。设置子系统不会创建复杂设置对象的默认实例。

此外,如果您希望这些设置在程序集版本之间保持不变(即可升级),则需要在应用程序启动时升级设置。这在Miha Markič's博客和Raghavendra Prabhu's博客中详细介绍。

答案 1 :(得分:0)

我认为错误

  

设置属性   找不到'钥匙'。

发生

是因为您的设置文件中不存在“key”值(相当不言自明)。

据我所知,您无法以编程方式添加设置值,您可能需要调查将所需的所有设置添加到文件中,尽管一旦它们存在,我认为您将能够使用您提供的代码来保存更改。

要保存更改,您需要确保它们是“用户”设置,而不是“应用”。

设置文件是非常简单的XML,因此您可以通过将XML直接写入文件来解决问题,但我从未这样做过,所以无法确定它是否有用,或者必然会推荐这种方法。

http://msdn.microsoft.com/en-us/library/cftf714c.aspx是开始的MSDN链接。

答案 2 :(得分:0)

您可以在用户设置上执行Settings.Save()或类似操作,但请注意,此类设置不会像您期望的那样持久保存到app目录中的xxx.exe.config文件中。它们实际上位于用户文件夹的深处(搜索驱动器以查找xxx.exe.config)。下次在app目录中手动更改xxx.exe.config时,更改将神秘地不适用(系统仍在使用用户目录中保存的更改)。