C# Windows 窗体:实用地编辑/更新生成的 App.Config 文件中的字符串数组

问题描述 投票:0回答:1
c# xml app-config
1个回答
0
投票

仍然无法理解为什么需要在应用程序配置中存储数据,但无论如何。

首先,在您的设置文件中创建一个新参数。根据需要将其命名(下面示例中的“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”。

© www.soinside.com 2019 - 2024. All rights reserved.