You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# WinForm编程修改App.Config的ArrayOfStrings配置项

编程修改Windows Form app.config中的ArrayOfString类型配置项

问题说明

需要修改自动生成的app.config文件里的ArrayOfString类型配置项,期望生成的配置结构如下:

<setting name="Test" serializeAs="Xml">
   <value>
      <ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns:xsd="http://www.w3.org/2001/XMLSchema">
         <string>Test 1</string>
         <string>Test 2</string>
         <string>Test 3</string>
      </ArrayOfString>
   </value>
</setting>

但当前代码生成的内容仅为单个字符串,结构错误:

<setting name="Test" serializeAs="Xml">
   <value>New Data 3</value>
</setting>

当前代码问题

原代码通过循环给appData.Value.ValueXml.InnerText赋值,每次都会覆盖之前的内容,最终只保留最后一个字符串;同时没有构建ArrayOfString所需的XML节点结构,导致配置格式不符合要求。

修正后的代码

public void saveCardDataToSettings()
{
    List<String> DetectorCardTypeData = new List<string>();
    foreach (DataGridViewRow row in dgvDetectorCardData.Rows)
    {
        // 跳过空行,避免空值拼接报错
        if (row.Cells[0].Value == null || row.Cells[2].Value == null || row.Cells[4].Value == null)
            continue;
            
        string CurrentRowData = $"{row.Cells[0].Value},{row.Cells[2].Value},{row.Cells[4].Value}";
        DetectorCardTypeData.Add(CurrentRowData);
    }

    StringCollection TestData = new StringCollection();
    foreach (string CardData in DetectorCardTypeData)
    {
        TestData.Add(CardData);
    }

    Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
    ConfigurationSectionGroup applicationSectionGroup = config.GetSectionGroup("applicationSettings");
    ConfigurationSection applicationConfigSection = applicationSectionGroup.Sections["EXP_Battery_Calculator.Properties.Settings"];
    ClientSettingsSection clientSection = (ClientSettingsSection)applicationConfigSection;

    SettingElement appData = clientSection.Settings.Get("Test");
    // 清空原有节点内容,避免残留旧数据
    appData.Value.ValueXml.RemoveAll();

    // 创建ArrayOfString节点并添加标准XML命名空间
    XmlDocument doc = appData.Value.ValueXml.OwnerDocument;
    XmlElement arrayOfString = doc.CreateElement("ArrayOfString");
    arrayOfString.SetAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
    arrayOfString.SetAttribute("xmlns:xsd", "http://www.w3.org/2001/XMLSchema");

    // 遍历数据创建对应的<string>子节点
    foreach (string item in TestData)
    {
        XmlElement stringNode = doc.CreateElement("string");
        stringNode.InnerText = item;
        arrayOfString.AppendChild(stringNode);
    }

    // 将构建好的ArrayOfString节点添加到value节点下
    appData.Value.ValueXml.AppendChild(arrayOfString);

    applicationConfigSection.SectionInformation.ForceSave = true;
    // 只保存修改的部分,提升效率
    config.Save(ConfigurationSaveMode.Modified);

    listBox1.DataSource = TestData;
}

关键修正点

  • 清空原有value节点内容,避免旧数据残留
  • 手动构建ArrayOfString节点并添加标准XML命名空间,匹配自动生成的配置格式
  • 遍历数据逐个创建<string>子节点,确保所有数据都被正确写入
  • 使用ConfigurationSaveMode.Modified仅保存修改项,减少不必要的IO操作

内容的提问来源于stack exchange,提问作者816Code

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 14:45:06