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
相关产品推荐
相关产品推荐

