【问题标题】:How do I allow project user setting to be of type List<string>?如何允许项目用户设置为 List<string> 类型?
【发布时间】:2011-09-12 11:20:31
【问题描述】:

我的应用目前使用用户设置系统(通过项目属性)来存储用户特定的数据。我使用这些设置而不是向 App.Config 写入/从 App.Config 写入,因为我需要在 ClickOnce 更新其构建时保留数据。

现在我需要用户能够指定要存储在用户设置中的字符串列表。我已经处理了 C# PropertyGrid 中的设置,并且我已经验证,如果我设置 MyPropertyGrid.SelectedObject = new List&lt;string&gt;(),它会给我一个合适的编辑器来编辑字符串列表。

不幸的是,当我转到 Project Preferences -> Settings 并单击 Browse 类型时,我无法选择 List 或找到任何用于字符串列表的好类型。有人对如何在用户设置中存储字符串列表有任何建议吗?

【问题讨论】:

    标签: c# app-config settings


    【解决方案1】:

    当设计器不允许您选择类型时,您可以手动添加自己的设置。某些内置类型和许多您自己的自定义类型可能会发生这种情况。这是关于 SO 的类似问题的链接:

    Why am I unable to select a custom Type for a setting from the same project/assembly as the settings file?

    这是一个答案的链接(它在 VB.NET 中,但原则适用):

    http://blog.coretech.dk/jgs/add-custom-data-type-structure-to-mysettings-in-vbnet-wpf/

    【讨论】:

    • 我将把它标记为答案,只是因为它提供了一个很好的链接,说明如何在用户设置 GUI 中使类型可用。
    【解决方案2】:

    嗯...我可以在类型列表中看到System.Collections.Specialized.StringCollection。你为什么不直接用这个?

    您可以在StringCollectionList&lt;string&gt; 之间使用以下转换:

    var stringList = stringCollection.Cast<string>().ToList();
    
    var stringCollection = new StringCollection();
    stringCollection.AddRange(stringList.ToArray());
    

    【讨论】:

    • 不知道我是怎么错过的。不幸的是,在尝试了这个之后,属性网格并不真正喜欢它们,因为当我单击添加一个新网格时,我得到'找不到'System.String'类型的构造函数'。 :-/
    • 您不能在属性网格中使用List&lt;string&gt; 并在保存之前将其转换为StringCollection 吗?
    • 属性网格直接连接到Properties.Settings.Default 对象。我想我可以为属性网格创建一个 DTO 或中间类
    • 没关系,与我之前的想法相反,List&lt;string&gt; 实际上也不起作用。我得到与StringCollection 相同的错误
    • @KallDrexx:我认为你应该在这里接受一个答案(最好是我的*g*)并打开一个新问题,因为你原来的问题已经解决了。
    【解决方案3】:

    设计者无法做到,但可以手动编辑设置文件。

    问题是,VS 允许在设置文件中默认序列化 int[] 类型 - 它只是默认情况下不允许您选择它。因此,创建一个具有所需名称的设置(例如 SomeTestSetting)并将其设置为任何类型(例如默认为字符串)。保存更改。

    现在转到您的项目文件夹并使用文本编辑器(例如记事本)打开“Properties\Settings.settings”文件,或者您可以通过在解决方案资源管理器中右键单击“-> 属性-> 在 VS 中打开它” Settings.settings”,选择“打开方式...”,然后选择“XML 编辑器”或“源代码(文本)编辑器”。在打开的 xml 设置中找到您的设置(如下所示):

    <Setting Name="SomeTestSetting" Type="System.String" Scope="User">
      <Value Profile="(Default)" />
    </Setting>
    

    将“类型”参数从 System.String 更改为 List。现在这部分将如下所示:

    <Setting Name="SomeTestSetting" Type="System.Collections.Generic.List`1[System.String]" Scope="User">
      <Value Profile="(Default)" />
    </Setting>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-16
      • 2017-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-19
      • 1970-01-01
      • 2013-09-22
      相关资源
      最近更新 更多