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

边栏推荐
- 2022年T电梯修理题库及模拟考试
- Common interview questions ①
- Seven crimes of counting software R & D Efficiency
- [2020 overview] overview of link prediction based on knowledge map embedding
- How to choose the right server for website data collection?
- 总结全了,低代码还需要解决这4点问题
- 2022年煤气考试题库及在线模拟考试
- Shell之分析服务器日志命令集锦
- 软件研发的十大浪费:研发效能的另一面
- 数据加载及预处理
猜你喜欢

Pytorch(三) —— 函数优化

Pytorch(四) —— 可视化工具 Visdom

Use winmtr software to simply analyze, track and detect network routing

The index is invalid

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

Obtain detailed ideas for ABCDEF questions of 2022 American Games

Shell之一键自动部署Redis任意版本

扩展-Fragment

Daily question - line 10

Maixll-Dock 快速上手
随机推荐
神经网络-使用Sequential搭建神经网络
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
2022 t elevator repair question bank and simulation test
Haskell lightweight threads overhead and use on multicores
RDF query language SPARQL
Web server: how to choose a good web server these five aspects should be paid attention to
LM small programmable controller software (based on CoDeSys) note 19: errors do not match the profile of the target
C language games (I) -- guessing games
slf4j 简单实现
Task04 | statistiques mathématiques
Maixll-Dock 使用方法
Openresty rewrites the location of 302
Announcement on the list of Guangdong famous high-tech products to be selected in 2021
LM小型可编程控制器软件(基于CoDeSys)笔记十九:报错does not match the profile of the target
2022.2.7-2.13 AI industry weekly (issue 84): family responsibilities
RuntimeError: “max_pool2d“ not implemented for ‘Long‘
Why is Internet thinking not suitable for AI products?
Question bank and online simulation examination for special operation certificate of G1 industrial boiler stoker in 2022
Research on medical knowledge atlas question answering system (I)
Knowledge supplement: redis' basic data types and corresponding commands