当前位置:网站首页>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文件

边栏推荐
- Software testing needs more and more talents. Why do you still not want to take this path?
- Odeint and GPU
- Basic exercise of test questions hexadecimal to decimal
- Ospfb notes - five messages [ultra detailed] [Hello message, DD message, LSR message, LSU message, lsack message]
- 2022年G1工业锅炉司炉特种作业证考试题库及在线模拟考试
- 2022.2.7-2.13 AI industry weekly (issue 84): family responsibilities
- (12) Somersault cloud case (navigation bar highlights follow)
- LM小型可编程控制器软件(基于CoDeSys)笔记二十:plc通过驱动器控制步进电机
- Openresty rewrites the location of 302
- Tencent has five years of testing experience. It came to the interview to ask for 30K, and saw the so-called software testing ceiling
猜你喜欢

js 图片路径转换base64格式

Applications and features of VR online exhibition
![Ospfb notes - five messages [ultra detailed] [Hello message, DD message, LSR message, LSU message, lsack message]](/img/aa/a255d225d71e6ba2b497f8d59f5f11.jpg)
Ospfb notes - five messages [ultra detailed] [Hello message, DD message, LSR message, LSU message, lsack message]

神经网络-使用Sequential搭建神经网络

2022年聚合工艺考试题及模拟考试

2022 gas examination question bank and online simulation examination

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

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

尺取法:有效三角形的个数

slf4j 简单实现
随机推荐
Leecode records the number of good segmentation of 1525 strings
2022危险化学品生产单位安全生产管理人员题库及答案
TASK04|數理統計
Odeint and GPU
(12) Somersault cloud case (navigation bar highlights follow)
Grey correlation cases and codes
Daily question - line 10
【硬十宝典目录】——转载自“硬件十万个为什么”(持续更新中~~)
LM小型可编程控制器软件(基于CoDeSys)笔记二十:plc通过驱动器控制步进电机
Section 27 remote access virtual private network workflow and experimental demonstration
How do I sort a list of strings in dart- How can I sort a list of strings in Dart?
VIM easy to use tutorial
Dual Contrastive Learning: Text Classification via Label-Aware Data Augmentation 阅读笔记
【LeetCode】100. Same tree
Annual inventory review of Alibaba cloud's observable practices in 2021
AssertionError assert I.ndim == 4 and I.shape[1] == 3
【硬十宝典】——1.【基础知识】电源的分类
Announcement on the list of Guangdong famous high-tech products to be selected in 2021
Offline installation of Wireshark 2.6.10
About the transmission pipeline of stage in spark