当前位置:网站首页>C#读写应用程序配置文件App.exe.config,并在界面上显示
C#读写应用程序配置文件App.exe.config,并在界面上显示
2022-07-01 04:36:00 【斯内科】
C#读写应用程序配置文件App.exe.config,本质是xml文件的读写。
我们将配置文件的AppSettings节点和ConnectionStrings节点内容自动绑定到分组框控件GroupBox中,同时可以批量保存。
一、新建Windows窗体应用程序SaveDefaultXmlConfigDemo,将默认的Form1重命名为FormSaveDefaultXmlConfig。
窗体 FormSaveDefaultXmlConfig设计如图:

添加对System.Configuration的引用。
为窗体FormSaveDefaultXmlConfig绑定Load事件FormSaveDefaultXmlConfig_Load
为按钮btnSaveConfig绑定事件btnSaveConfig_Click。
二、默认的应用程序配置文件App.config配置如下:
<?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>三、窗体FormSaveDefaultXmlConfig源程序如下
(忽略设计器自动生成的代码):
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文件

边栏推荐
- Odeint and GPU
- Maixll-Dock 使用方法
- Sorting out 49 reports of knowledge map industry conference | AI sees the future with wisdom
- slf4j 简单实现
- [ue4] event distribution mechanism of reflective event distributor and active call event mechanism
- Rule method: number of effective triangles
- Execution failed for task ‘:app:processDebugResources‘. > A failure occurred while executing com. and
- OSPF notes [multiple access, two multicast addresses with OSPF]
- [deep learning] (4) decoder mechanism in transformer, complete pytoch code attached
- Dual Contrastive Learning: Text Classification via Label-Aware Data Augmentation 阅读笔记
猜你喜欢

Registration for R2 mobile pressure vessel filling test in 2022 and R2 mobile pressure vessel filling free test questions

Rule method: number of effective triangles

2022 tea master (intermediate) examination question bank and tea master (intermediate) examination questions and analysis

Execution failed for task ‘:app:processDebugResources‘. > A failure occurred while executing com. and

LM small programmable controller software (based on CoDeSys) note 19: errors do not match the profile of the target

Research on medical knowledge atlas question answering system (I)

How to do the performance pressure test of "Health Code"

Internet winter, how to spend three months to make a comeback

Daily algorithm & interview questions, 28 days of special training in large factories - the 13th day (array)
![[pat (basic level) practice] - [simple simulation] 1064 friends](/img/37/0ef0f8aae15ae574be1d76c97497c9.jpg)
[pat (basic level) practice] - [simple simulation] 1064 friends
随机推荐
OdeInt与GPU
The junior college students were angry for 32 days, four rounds of interviews, five hours of soul torture, and won Ali's offer with tears
MySQL winter vacation self-study 2022 12 (5)
Shell analysis server log command collection
[recommended algorithm] C interview question of a small factory
AssertionError assert I.ndim == 4 and I.shape[1] == 3
OSPF notes [multiple access, two multicast addresses with OSPF]
Pytorch(三) —— 函数优化
CF1638E. Colorful operations Kodori tree + differential tree array
LM小型可编程控制器软件(基于CoDeSys)笔记十九:报错does not match the profile of the target
VIM简易使用教程
Caijing 365 stock internal reference | the first IPO of Beijing stock exchange; the subsidiary of the recommended securities firm for gambling and gambling, with a 40% discount
Ten wastes of software research and development: the other side of research and development efficiency
Threejs opening
TASK04|數理統計
LM小型可编程控制器软件(基于CoDeSys)笔记二十:plc通过驱动器控制步进电机
神经网络-非线性激活
离线安装wireshark2.6.10
[difficult] sqlserver2008r2, can you recover only some files when recovering the database?
JS rotation chart