2008-10-14 29 views
1

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

例如,我在我的应用程序中有一些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’没有被发现。”有什么我失踪?

回答

1

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

一个好的选择可能是一个Xml序列化字典。快速google search发现了不少博客文章,介绍了如何实现该功能。

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

另外,如果你想这些设置集版本(即是可升级),您将需要升级应用程序启动的设置之间仍然存在。这是在Miha Markič's博客和Raghavendra Prabhu's博客上详细描述的。

0

我认为错误

设置属性 的 '钥匙' 没有被发现。

发生是因为'key'值在您的设置文件中不存在(相当明显)。

据我所知,你不能以编程方式添加设置值,你可能需要调查所有你需要的设置,毕竟,尽管一旦他们在那里,我想你会能够使用您提供的代码来保存更改。

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

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

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

0

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