简体   繁体   English

将自定义 class 的集合添加到 Settings.Settings

[英]Add a collection of a custom class to Settings.Settings

I've been having a helluva time trying to add a custom collection of a custom class to the application settings of my winforms project I feel like Ive tried it about six different ways, including this way , this way , this way , and this way but nothing seems to work...我一直在尝试将自定义 class 的自定义集合添加到我的 winforms 项目的应用程序设置中,我觉得我已经尝试了六种不同的方式,包括这种方式这种方式这种方式这种方式但似乎没有任何效果......

Currently the code complies, and runs fine - no exceptions anywhere.目前代码符合要求,并且运行良好 - 任何地方都没有例外。 Code his the Save function but no entries are created in the settings xml file (I have a few other settings and it works for all of them but this one FYI).对他的 Save function 进行编码,但在设置 xml 文件中没有创建任何条目(我还有一些其他设置,它适用于所有设置,但仅供参考)。 When it loads, Properties.Settings.Default.LastSearches is always null... Any thoughts?加载时, Properties.Settings.Default.LastSearches始终为 null... 有什么想法吗?

Heres my current code:这是我当前的代码:

The Classes:课程:

[Serializable]
public class LastSearch : ISerializable
{
    public DateTime Date { get; set; }
    public string Hour { get; set; }
    public string Log { get; set; }
    public string Command { get; set; }
    public List<string> SelectedFilters { get; set; }
    public List<string> SearchTerms { get; set; }
    public List<string> HighlightedTerms { get; set; }
    public List<string> ExcludedTerms { get; set; }

    public LastSearch(DateTime date, string hour, string log, string command, List<string> selectedFilters,
        List<string> searchTerms, List<string> highlightedTerms, List<string> excludedTerms)
    {
        Date = date.ToUniversalTime();
        Hour = hour;
        Log = log;
        Command = command;
        SelectedFilters = selectedFilters;
        SearchTerms = searchTerms;
        HighlightedTerms = highlightedTerms;
        ExcludedTerms = excludedTerms;
    }

    protected LastSearch(SerializationInfo info, StreamingContext context)
    {
        Date = info.GetDateTime("Date");
        Hour = info.GetString("Hour");
        Log = info.GetString("Log");
        Command = info.GetString("Command");
        SelectedFilters = (List<string>)info.GetValue("SelectedFilters", typeof(List<string>));
        SearchTerms = (List<string>)info.GetValue("SearchTerms", typeof(List<string>));
        HighlightedTerms = (List<string>)info.GetValue("HighlightedTerms", typeof(List<string>));
        ExcludedTerms = (List<string>)info.GetValue("ExcludedTerms", typeof(List<string>));
    }
    [SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)]

    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        info.AddValue("Date", Date);
        info.AddValue("Hour", Hour);
        info.AddValue("Log", Log);
        info.AddValue("Command", Command);
        info.AddValue("SelectedFilters", SelectedFilters);
        info.AddValue("SearchTerms", SearchTerms);
        info.AddValue("HighlightedTerms", HighlightedTerms);
        info.AddValue("ExcludedTerms", ExcludedTerms);
    }
}

[Serializable]
public class LastSearchCollection : ISerializable
{
    public List<LastSearch> Searches { get; set; }

    public LastSearchCollection()
    {
        Searches = new List<LastSearch>();
    }

    public LastSearchCollection(SerializationInfo info, StreamingContext ctxt)
    {
        Searches = (List<LastSearch>)info.GetValue("LastSearches", typeof(List<LastSearch>));
    }
    [SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)]

    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        info.AddValue("Searches", Searches);
    }
}

Writing to Settings:写入设置:

if (RecentQueriesToolStripMenuItem.DropDownItems.Count > 0)
{
    // Last Search Settings
    if (Properties.Settings.Default.LastSearches == null)
        Properties.Settings.Default.LastSearches = new LastSearchCollection();

    Properties.Settings.Default.LastSearches.Searches.Clear();
    foreach (LastSearchMenuItem item in RecentQueriesToolStripMenuItem.DropDownItems)
    {
        Properties.Settings.Default.LastSearches.Searches.Add(item.SearchData);
    }
}

// Save all settings
Properties.Settings.Default.Save();

Loading from setttings从设置加载

// Last Searches
if (Properties.Settings.Default.LastSearches != null)
{
    int i = 0;
    foreach (LastSearch search in Properties.Settings.Default.LastSearches.Searches)
    {
        LastSearchMenuItem searchMenuItem = new LastSearchMenuItem(search);
        RecentQueriesToolStripMenuItem.DropDownItems.Add(searchMenuItem);
        RecentQueriesToolStripMenuItem.DropDownItems[i].Click += new EventHandler(RecentSearch_Click);
        i++;
    }
}

as suggested in the comments this link on codeproject.com has a nice simple tutorial on how to create custom User Settings.正如评论中所建议的那样,codeproject.com 上的这个链接有一个关于如何创建自定义用户设置的简单教程。

Glad I could help.很高兴我能帮上忙。

After more than 8 years i had the same need that you had. 8 年多后,我有和你一样的需求。 I solved it using XML Serialization to store the custom collection in the user settings.我使用 XML 序列化将自定义集合存储在用户设置中解决了它。

Here is an example adopted to your code.这是您的代码采用的示例。

First of all you need to set the type of your setting to the type of your collection class (eg "MyProject.LastSearchCollection").首先,您需要将设置的类型设置为您的集合 class 的类型(例如“MyProject.LastSearchCollection”)。 See Why am I unable to select a custom Type for a setting from the same project/assembly as the settings file?请参阅为什么我无法为来自与设置文件相同的项目/程序集的设置设置自定义类型? on how to do this.关于如何做到这一点。 If Visual Studio says it can't find your custom class, make sure the class is public and has a public, parameterless constructor.如果 Visual Studio 说它找不到您的自定义 class,请确保 class 是公共的并且具有公共的无参数构造函数。

The custom class:自定义 class:

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Runtime.Serialization;

namespace MyProject
{
    [SettingsSerializeAs(SettingsSerializeAs.Xml)]
    public class LastSearch
    {
        public DateTime Date { get; set; }
        public string Hour { get; set; }
        public string Log { get; set; }
        public string Command { get; set; }
        public List<string> SelectedFilters { get; set; }
        public List<string> SearchTerms { get; set; }
        public List<string> HighlightedTerms { get; set; }
        public List<string> ExcludedTerms { get; set; }

        public LastSearch(DateTime date, string hour, string log, string command, List<string> selectedFilters,
            List<string> searchTerms, List<string> highlightedTerms, List<string> excludedTerms)
        {
            Date = date.ToUniversalTime();
            Hour = hour;
            Log = log;
            Command = command;
            SelectedFilters = selectedFilters;
            SearchTerms = searchTerms;
            HighlightedTerms = highlightedTerms;
            ExcludedTerms = excludedTerms;
        }

        protected LastSearch(SerializationInfo info, StreamingContext context)
        {
            Date = info.GetDateTime("Date");
            Hour = info.GetString("Hour");
            Log = info.GetString("Log");
            Command = info.GetString("Command");
            SelectedFilters = (List<string>)info.GetValue("SelectedFilters", typeof(List<string>));
            SearchTerms = (List<string>)info.GetValue("SearchTerms", typeof(List<string>));
            HighlightedTerms = (List<string>)info.GetValue("HighlightedTerms", typeof(List<string>));
            ExcludedTerms = (List<string>)info.GetValue("ExcludedTerms", typeof(List<string>));
        }
    }

    [SettingsSerializeAs(SettingsSerializeAs.Xml)]
    public class LastSearchCollection
    {
        public List<LastSearch> Searches { get; set; }

        public LastSearchCollection()
        {
            Searches = new List<LastSearch>();
        }

        public LastSearchCollection(SerializationInfo info, StreamingContext ctxt)
        {
            Searches = (List<LastSearch>)info.GetValue("LastSearches", typeof(List<LastSearch>));
        }
    }
}

The only differences are, that i added the [SettingsSerializeAs(SettingsSerializeAs.Xml)] attributes and removed your serialization functions.唯一的区别是,我添加了[SettingsSerializeAs(SettingsSerializeAs.Xml)]属性并删除了您的序列化函数。 You may have to add the reference System.Configuration to your project.您可能必须将参考System.Configuration添加到您的项目中。

Save the settings just like:像这样保存设置:

LastSearchCollection searches =  new LastSearchCollection();

List<string> selectedFilters = new List<string>();
selectedFilters.Add("Filter1");
selectedFilters.Add("Filter2");
selectedFilters.Add("FilterN");

searches.Searches.Add(new LastSearch(DateTime.Now, "7", "Log1", "CommandA", selectedFilters, new List<string>(), new List<string>(), new List<string>()));
searches.Searches.Add(new LastSearch(DateTime.Now, "9", "Log2", "CommandB", new List<string>(), new List<string>(), new List<string>(), new List<string>()));
Properties.Settings.Default.LastSearches = searches;

// Save all settings
Properties.Settings.Default.Save();

Afterwards the user.config written to disc will look like this:之后写入光盘的 user.config 将如下所示:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <configSections>
    ...
    </configSections>
    <userSettings>
    ...
        <MyProject.Properties.Settings>
            <setting name="LastSearches" serializeAs="Xml">
                <value>
                    <LastSearchCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                        xmlns:xsd="http://www.w3.org/2001/XMLSchema">
                        <Searches>
                            <LastSearch>
                                <Date>2020-03-01T07:49:44.5512864Z</Date>
                                <Hour>7</Hour>
                                <Log>Log1</Log>
                                <Command>CommandA</Command>
                                <SelectedFilters>
                                    <string>Filter1</string>
                                    <string>Filter2</string>
                                    <string>FilterN</string>
                                </SelectedFilters>
                                <SearchTerms />
                                <HighlightedTerms />
                                <ExcludedTerms />
                            </LastSearch>
                            <LastSearch>
                                <Date>2020-03-01T07:49:44.5562864Z</Date>
                                <Hour>9</Hour>
                                <Log>Log2</Log>
                                <Command>CommandB</Command>
                                <SelectedFilters />
                                <SearchTerms />
                                <HighlightedTerms />
                                <ExcludedTerms />
                            </LastSearch>
                        </Searches>
                    </LastSearchCollection>
                </value>
            </setting>
        </MyProject.Properties.Settings>
    </userSettings>
</configuration>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM