C#读写应用程序配置文件App.exe.config,本质是xml文件的读写。
我们将配置文件的AppSettings节点和ConnectionStrings节点内容自动绑定到分组框控件GroupBox中,同时可以批量保存。
窗体 FormSaveDefaultXmlConfig设计如图:

添加对System.Configuration的引用。
为窗体FormSaveDefaultXmlConfig绑定Load事件FormSaveDefaultXmlConfig_Load
为按钮btnSaveConfig绑定事件btnSaveConfig_Click。
- <?xml version="1.0" encoding="utf-8" ?>
- <configuration>
- <startup>
- <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
- </startup>
- <appSettings>
- <add key="SoftName" value="Sword7" />
- <add key="Supplier" value="SoftStar" />
- <add key="EnabledTcp" value="1" />
- </appSettings>
- <connectionStrings>
- <add name="DataConnect" providerName="MySql.Data" connectionString="server=127.0.0.1;Database=test;Uid=root;Pwd=root;" />
- <add name="ExternalConnect" providerName="System.Data.SqlClient" connectionString="server=127.0.0.1;Database=external;Uid=root;Pwd=123456;" />
- </connectionStrings>
- </configuration>
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Configuration;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Forms;
-
- namespace SaveDefaultXmlConfigDemo
- {
- public partial class FormSaveDefaultXmlConfig : Form
- {
- public FormSaveDefaultXmlConfig()
- {
- InitializeComponent();
- //添加引用System.Configuration
- }
-
- private void btnSaveConfig_Click(object sender, EventArgs e)
- {
- try
- {
- Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
- List<Tuple<string, string>> tupleAppSettings = GetAppSettingList();
- for (int i = 0; i < tupleAppSettings.Count; i++)
- {
- //修改配置节点AppSettings的内容
- config.AppSettings.Settings[tupleAppSettings[i].Item1].Value = tupleAppSettings[i].Item2;
- }
- List<Tuple<string, string, string>> tupleConnectionStrings = GetConnectionStringList();
- for (int i = 0; i < tupleConnectionStrings.Count; i++)
- {
- //修改配置节点ConnectionStrings的内容
- config.ConnectionStrings.ConnectionStrings[tupleConnectionStrings[i].Item1].ProviderName = tupleConnectionStrings[i].Item2;
- config.ConnectionStrings.ConnectionStrings[tupleConnectionStrings[i].Item1].ConnectionString = tupleConnectionStrings[i].Item3;
- }
- //保存配置文件
- config.Save();
- MessageBox.Show($"保存应用程序配置文件成功,开始重新加载应用程序配置.", "提示");
-
- //刷新配置
- FormSaveDefaultXmlConfig_Load(null, e);
- }
- catch (Exception ex)
- {
- MessageBox.Show($"保存应用程序配置文件出错:{ex.Message}", "出错");
- }
- }
-
- /// <summary>
- /// 获取配置节点AppSettings的所有内容,将其添加到元组列表中
- /// </summary>
- /// <returns></returns>
- private List<Tuple<string, string>> GetAppSettingList()
- {
- List<Tuple<string, string>> tupleAppSettings = new List<Tuple<string, string>>();
- for (int i = 0; i < groupBox1.Controls.Count; i++)
- {
- if (groupBox1.Controls[i] is Label lbl)
- {
- Control[] controls = groupBox1.Controls.Find($"txtValue{lbl.Tag}", true);
- if (controls == null || controls.Length == 0)
- {
- throw new Exception($"没有找到【{lbl.Text}】对应的文本框控件【txtValue{lbl.Tag}】");
- }
- tupleAppSettings.Add(Tuple.Create(lbl.Text, controls[0].Text));
- }
- }
- return tupleAppSettings;
- }
-
- /// <summary>
- /// 获取配置节点onnectionStrings的所有内容,将其添加到元组列表中
- /// </summary>
- /// <returns></returns>
- private List<Tuple<string, string, string>> GetConnectionStringList()
- {
- List<Tuple<string, string, string>> tupleConnectionStrings = new List<Tuple<string, string, string>>();
- for (int i = 0; i < groupBox2.Controls.Count; i++)
- {
- if (groupBox2.Controls[i] is Label lbl && lbl.Name.StartsWith("lblName"))
- {
- Control[] controlProviderNames = groupBox2.Controls.Find($"txtProviderName{lbl.Tag}", true);
- if (controlProviderNames == null || controlProviderNames.Length == 0)
- {
- throw new Exception($"没有找到【{lbl.Text}】对应的文本框控件【txtProviderName{lbl.Tag}】");
- }
- Control[] controlConnectionStrings = groupBox2.Controls.Find($"txtConnectionString{lbl.Tag}", true);
- if (controlConnectionStrings == null || controlConnectionStrings.Length == 0)
- {
- throw new Exception($"没有找到【{lbl.Text}】对应的文本框控件【txtConnectionString{lbl.Tag}】");
- }
- tupleConnectionStrings.Add(Tuple.Create(lbl.Text, controlProviderNames[0].Text, controlConnectionStrings[0].Text));
- }
- }
- return tupleConnectionStrings;
- }
-
- private void FormSaveDefaultXmlConfig_Load(object sender, EventArgs e)
- {
- try
- {
- Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
- txtFilePath.Text = config.FilePath;
- //读取配置AppSetting节点,
- KeyValueConfigurationCollection keyValueCollection = config.AppSettings.Settings;
- AddAppSettingConfig(keyValueCollection);
- //读取连接字符串ConnectionStrings节点
- ConnectionStringSettingsCollection connectionCollection = config.ConnectionStrings.ConnectionStrings;
- AddConnectionStringConfig(connectionCollection);
- }
- catch (Exception ex)
- {
- MessageBox.Show($"加载应用程序配置文件出错:{ex.Message}", "出错");
- }
- }
-
- /// <summary>
- /// 读取所有的AppSetting节点,将其绑定到groupBox1中
- /// 只考虑在配置文件中【IsPresent为true】的节点
- /// </summary>
- /// <param name="keyValueCollection"></param>
- private void AddAppSettingConfig(KeyValueConfigurationCollection keyValueCollection)
- {
- groupBox1.Controls.Clear();
- int index = 0;
- foreach (KeyValueConfigurationElement keyValueElement in keyValueCollection)
- {
- ElementInformation elemInfo = keyValueElement.ElementInformation;
- if (!elemInfo.IsPresent)
- {
- //考虑到部分配置不是在App.exe.config配置文件中,此时不做处理
- continue;
- }
- Label label = new Label();
- label.AutoSize = true;
- label.Location = new System.Drawing.Point(20, 20 + index * 30);
- label.Name = $"lblKey{index + 1}";
- label.Text = keyValueElement.Key;
- label.Tag = index + 1;
-
- TextBox textBox = new TextBox();
- textBox.Location = new System.Drawing.Point(120, 20 + index * 30);
- textBox.Name = $"txtValue{index + 1}";
- textBox.Size = new System.Drawing.Size(300, 21);
- textBox.Text = keyValueElement.Value;
-
- groupBox1.Controls.AddRange(new Control[] { label, textBox });
- index++;
- }
- }
-
- /// <summary>
- /// 读取所有的ConnectionString节点,将其绑定到groupBox2中
- /// 只考虑在配置文件中【IsPresent为true】的节点
- /// </summary>
- /// <param name="connectionCollection"></param>
- private void AddConnectionStringConfig(ConnectionStringSettingsCollection connectionCollection)
- {
- groupBox2.Controls.Clear();
- int index = 0;
- foreach (ConnectionStringSettings connectElement in connectionCollection)
- {
- ElementInformation elemInfo = connectElement.ElementInformation;
- if (!elemInfo.IsPresent)
- {
- //考虑到连接字符串有系统默认配置,不在配置文件中【IsPresent=false】,因此过滤掉,如下面两个
- //LocalSqlServer、LocalMySqlServer
- continue;
- }
- Label label = new Label();
- label.AutoSize = true;
- label.Location = new System.Drawing.Point(20, 20 + index * 30);
- label.Name = $"lblName{index + 1}";
- label.Text = connectElement.Name;
- label.Tag = index + 1;
-
- TextBox textBox = new TextBox();
- textBox.Location = new System.Drawing.Point(120, 20 + index * 30);
- textBox.Name = $"txtConnectionString{index + 1}";
- textBox.Size = new System.Drawing.Size(360, 21);
- textBox.Text = connectElement.ConnectionString;
-
- Label lblFixed = new Label();
- lblFixed.AutoSize = true;
- lblFixed.Location = new System.Drawing.Point(500, 20 + index * 30);
- lblFixed.Name = $"lblFixed{index + 1}";
- lblFixed.Text = "提供程序名称";
-
- TextBox txtProviderName = new TextBox();
- txtProviderName.Location = new System.Drawing.Point(580, 20 + index * 30);
- txtProviderName.Name = $"txtProviderName{index + 1}";
- txtProviderName.Size = new System.Drawing.Size(140, 21);
- txtProviderName.Text = connectElement.ProviderName;
-
- groupBox2.Controls.AddRange(new Control[] { label, textBox, lblFixed, txtProviderName });
- index++;
- }
- }
- }
- }

修改保存配置后,打开SaveDefaultXmlConfigDemo.exe.Config文件
