gpt4 book ai didi

c# - 将自定义类的集合添加到 Settings.Settings

转载 作者:太空狗 更新时间:2023-10-29 17:51:09 28 4
gpt4 key购买 nike

我一直在尝试将自定义类的自定义集合添加到我的 winforms 项目的应用程序设置中,我觉得我已经尝试了六种不同的方法,包括 this way , this way , this way , 和 this way但似乎没有任何效果......

目前代码符合要求,并且运行良好 - 没有任何异常。对他的保存功能进行编码,但在设置 xml 文件中没有创建任何条目(我有一些其他设置,它适用于所有这些设置,但仅供引用)。加载时,Properties.Settings.Default.LastSearches 始终为空...有什么想法吗?

这是我当前的代码:

类:

[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);
}
}

写入设置:

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();

从设置加载

// 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++;
}
}

最佳答案

在 8 年多之后,我和你有同样的需求。我使用 XML 序列化将自定义集合存储在用户设置中解决了这个问题。

这是您的代码采用的示例。

首先您需要将设置的类型设置为您的集合类的类型(例如“MyProject.LastSearchCollection”)。参见 Why am I unable to select a custom Type for a setting from the same project/assembly as the settings file?关于如何做到这一点。如果 Visual Studio 说它找不到您的自定义类,请确保该类是公共(public)的并且具有公共(public)的无参数构造函数。

自定义类:

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>));
}
}
}

唯一的区别是,我添加了 [SettingsSerializeAs(SettingsSerializeAs.Xml)] 属性并删除了序列化函数。您可能必须将引用 System.Configuration 添加到您的项目。

像这样保存设置:

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();

之后写入光盘的 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>

关于c# - 将自定义类的集合添加到 Settings.Settings,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7000625/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com