1

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

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

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

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'。” 有什么我想念的吗?

4

3 回答 3

1

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

一个不错的选择可能是 Xml 可序列化字典。一个快速的谷歌搜索发现了很多不同的博客文章,描述了如何实现它。

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

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

于 2008-10-17T10:56:54.630 回答
0

我认为错误

未找到设置属性“键”。

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

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

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

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

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

于 2008-10-14T14:54:47.270 回答
0

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

于 2008-10-14T16:45:04.273 回答