Winforms - 动态加载/保存设置
题
我有一个“设置文件”在我的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'。”我有什么遗漏?
解决方案
将列宽设置存储在Xml Serializable对象中。即,实现 IXmlSerializable 的内容然后创建Settings.settings中该类型的单个设置条目。
一个好的选择可能是Xml Serializable Dictionary。一个快速的谷歌搜索发现了很多不同的博客文章,描述如何实现它。
如其他答案中所述,您需要确保此对象是用户设置。您可能还需要初始化设置实例。即,如果设置为null,则创建一个XmlSerializableDictionary()实例并将其分配给该设置。设置子系统不会创建复杂设置对象的默认实例。
此外,如果您希望这些设置在程序集版本之间保持不变(即可升级),则需要在应用程序启动时升级设置。这在 Miha Markič'中有详细描述。 s 博客和 Raghavendra Prabhu的博客。
其他提示
我认为错误
发生设置属性 找不到'钥匙'。
是因为您的设置文件中不存在“key”值(相当不言自明)。
据我所知,您无法以编程方式添加设置值,您可能需要调查将所需的所有设置添加到文件中,尽管一旦它们存在,我认为您将能够使用您提供的代码来保存更改。
要保存更改,您需要确保它们是“用户”设置,而不是“应用”。
设置文件是非常简单的XML,因此您可以通过将XML直接写入文件来解决问题,但我从未这样做过,所以无法确定它是否有用,或者必然会推荐这种方法。
http://msdn.microsoft.com/en-us/library /cftf714c.aspx 是要开始的MSDN链接。
您可以在用户设置上执行Settings.Save()或类似操作,但请注意,此类设置不会像您期望的那样持久保存到app目录中的xxx.exe.config文件中。它们实际上位于用户文件夹的深处(搜索驱动器以查找xxx.exe.config)。下次在app目录中手动更改xxx.exe.config时,更改将神秘地不适用(系统仍在使用用户目录中保存的更改)。