仍然无法理解为什么需要在应用程序配置中存储数据,但无论如何。
首先,在您的设置文件中创建一个新参数。根据需要将其命名(下面示例中的“StoredData”),将类型设置为
System.Collections.Specialized.StringCollections
,设置范围“Application”并添加默认值(我添加了“Empty”)。这应该会生成一个 XML 字符串:
<?xml version="1.0" encoding="utf-16"?>
<ArrayOfString xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<string>Empty</string>
</ArrayOfString>
并且还将修改默认配置:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="YourNamespace.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</sectionGroup>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
</startup>
<applicationSettings>
<YourNamespace.Properties.Settings>
<setting name="StoredData" serializeAs="Xml">
<value>
<ArrayOfString xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<string>Empty</string>
</ArrayOfString>
</value>
</setting>
</YourNamespace.Properties.Settings>
</applicationSettings>
</configuration>
要编辑
ArrayOfString
节点,我使用了以下代码:
// Diving through config nodes to <value> element
var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
if (config.SectionGroups["applicationSettings"] is not { } appSettings)
return;
if (appSettings.Sections.OfType<ClientSettingsSection>().FirstOrDefault(section => section.Settings.Get(nameof(Properties.Settings.Default.StoredData)) != null) is not { } settingsSection)
return;
if (settingsSection.Settings.Get(nameof(Properties.Settings.Default.StoredData))?.Value?.ValueXml is not { } storedData)
return;
// Removing everyting from <ArrayOfString> (including it)
storedData.RemoveAll();
// Initializing XmlDocument instance to create new nodes
var xDoc = new XmlDocument();
// Manually creating parent node <ArrayOfString xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
var xArrayOfString = xDoc.CreateElement("ArrayOfString");
xArrayOfString.SetAttribute("xmlns:xsd", "http://www.w3.org/2001/XMLSchema");
xArrayOfString.SetAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
// Just test collection of strings
var testData = Enumerable.Range(0, 10).Select(x => x.ToString());
// Looping through records of DataGridView, which should already been "stringified"
// Creating nodes <string>...</string> where "..." is string representation of each DataGridView row (in a way to want to store it)
foreach (var testDataItem in testData)
{
var xString = xDoc.CreateElement("string");
xString.InnerText = testDataItem;
xArrayOfString.AppendChild(xString);
}
// And appending new rebuilded <ArrayOfString> to a <value> node in config
storedData.AppendChild(storedData.OwnerDocument.ImportNode(xArrayOfString, true));
// And just saving
config.Save(ConfigurationSaveMode.Minimal, true);
那个例子,在
config.Save
调用之后立即重写配置并产生这样的外观:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="YourNamespace.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</sectionGroup>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
</startup>
<applicationSettings>
<YourNamespace.Properties.Settings>
<setting name="StoredData" serializeAs="Xml">
<value>
<ArrayOfString xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<string>0</string>
<string>1</string>
<string>2</string>
<string>3</string>
<string>4</string>
<string>5</string>
<string>6</string>
<string>7</string>
<string>8</string>
<string>9</string>
</ArrayOfString>
</value>
</setting>
</YourNamespace.Properties.Settings>
</applicationSettings>
</configuration>
但是它不会在运行时更新
Property.Settings.Default.StoredData
属性。只有在应用程序重新启动后,它才会从配置中加载修改后的数据。它也不会修改项目文件夹中的“App.config”。输出二进制文件附近只有“YourAssemblyName.exe.config”。
不确定这种方式是否合适或适用。仍然不明白为什么你决定以这种方式惩罚小配置文件。您对此有用户范围的设置。或者只是在应用程序目录中编写自己的单独文件,例如“myStoredData.xml”。