艾伟_转载:使用配置文件(.settings、.config)存储应用程序配置

引言

我不知大家早先是如何保存应用程序配置,以备下次打开时使用的,反正我开始学.Net的时候就去研究序列化,以二进制或XML格式的序列化来保存应用程序配置。这样每次都要建立单独的配置类,并书写读写配置代码,相当麻烦。

期间也看了看.config文件的读写方式,感觉还是很麻烦,不如自己序列化来的踏实。

后来才猛然发现微软早提供好了settings,用以定义.config文件内容,并生成相应的强类型类,使用起来极其方便~,感觉就像在火星居住了半辈子突然发现还有地球这好地方*_*~

鉴于网上settings方面的资料不多、不详,我就以此文来介绍一下基本的用法,让小鸟们少走我那条破路,老鸟请直接从上空滑翔而过即可。

 

基本使用方法

首先建立一个WinForm项目,设计这样一个窗体:

通过“添加新项”功能添加一个MyApp.settings:

 

在打开的数据表格中做如下设置:

这样就设置好了a、b、c三个不同类型的配置变量,现在就可以在程序中使用它们了:

 

private void Form1_Load(object sender, EventArgs e)

{

    numericUpDown1.Value = MyApp.Default.a;

    textBox1.Text = MyApp.Default.b;

    checkBox1.Checked = MyApp.Default.c;

}

 

private void Form1_FormClosing(object sender, FormClosingEventArgs e)

{

    MyApp.Default.a = numericUpDown1.Value;

    MyApp.Default.b = textBox1.Text;

    MyApp.Default.c = checkBox1.Checked;

    MyApp.Default.Save();

}

 

通过上面的代码就可以在窗体开闭时分别加载、保存配置了。

运行抓图:

 

复杂数据类型支持情况

settings支持存储一些较为复杂的数据,比如Color、Size等类型,可以自行选择:

但并不是所有类型都可以支持,比如FileInfo类型就没有,泛型也没有,自定义类型更是不受支持的,如果需要存储这些特殊类型,就得用其他配置方案了。

 

读写复杂数据类型

我们以ArrayList类型为例,通过它在原程序的基础上实现记录每次关闭程序时间的功能。

首先添加一个配置变量d,其类型为System.Collections.ArrayList:

在窗体中增加一个ListBoxt,然后修改后台代码为:

高亮部分为新增的代码。

多次运行以测试:

 可以看到每次的程序关闭时间都被记录并显示。

 

“用户”和“应用程序”

你可能注意到数据表格中“范围”这里全是“用户”:

如果改成另外一个选项,即“应用程序”会怎样呢?

报错了,我们的配置变量变成只读的了,所以这里可以简单地把它们理解为:

用户=可读写

应用程序=只读

“应用程序”选项应当是用于设定一些程序运行所必须的重要变量,比如导航网址、数学运算参数等,这些配置项如果让用户篡改就会出问题了,所以要只读。

 

数据被存在哪里?

你可能会发现编译后在Debug目录中有个“SettingTest.exe.config”,但无论如何操作程序,这个配置文件里始终都是描述的默认配置。

其实数据是被存在了“C:\Users\SkyD\AppData\Local\”目录中(我这是Windows7,XP或以下版本可能不是这里)

我在“C:\Users\SkyD\AppData\Local\SettingTest\SettingTest.vshost.exe_Url_ffofch2tvz5bil2xbhdayqbnqwppy2ce\1.0.0.0”这个目录中找到了配置文件(user.config),这是其描述的配置信息:

 

结语

虽然settings无法实现对一些复杂类型及自定义类型的支持,但是在多数情况下,用它来存储程序配置已是绰绰有余了,在够用的前提下,不要重复造轮子啦。

 

下载示例项目:http://www.uushare.com/user/icesee/file/2017630

下载本文的XPS版本:http://www.uushare.com/user/icesee/file/2017629

时间: 2024-10-10 07:18:31

艾伟_转载:使用配置文件(.settings、.config)存储应用程序配置的相关文章

艾伟_转载:用C#设计Windows应用程序模板

通常windows应用程序都有相似的特征:控件.菜单.工具条.状态栏等等.每次我们开始作一个新的windows应用程序时都是以相同的事情开始:建立项目,添加控件和事件处理器.如果我们有一个模板,那么我们就可以节约大量的时间了. 在介绍如何建立模板的过程中,将涉及大量的微软.net framework类库的基本知识.如果你没有使用集成开发环境那么本文介绍的模板对你将非常有用,如果你使用了visual studio.net这样的集成开发环境你也可以从中了解控件的工作方式,这对你也是很有用的. 写一个

使用配置文件(.settings、.config)存储应用程序配置

原文:使用配置文件(.settings..config)存储应用程序配置 引言 我不知大家早先是如何保存应用程序配置,以备下次打开时使用的,反正我开始学.Net的时候就去研究序列化,以二进制或XML格式的序列化来保存应用程序配置.这样每次都要建立单独的配置类,并书写读写配置代码,相当麻烦. 期间也看了看.config文件的读写方式,感觉还是很麻烦,不如自己序列化来的踏实. 后来才猛然发现微软早提供好了settings,用以定义.config文件内容,并生成相应的强类型类,使用起来极其方便~,感觉

艾伟_转载:ASP.NET中写自定义的Config Provider

一.写作前题     我们用ASP.NET做项目开发的时候,配置Config文件那是经常的事情,VS.NET的Config文件提供了很多节,但是往往提供的这些配置信息还不能够完全满足我们的项目开发需求,而且微软正是考虑到这方面的因素,他允许用户自定义Configuration的相关配置内容.本文就此写了一些实例,希望对大家有所帮助.   二.本文内容   1.实现web.config中的自定义2.对自定义节的使用3.本文总结 三.实现Web.Config中自定义节     废话不多说,直接说主题

艾伟_转载:ASP.NET Session详解

当用户在 Web 应用程序中导航 ASP.NET 页时,ASP.NET 会话状态使您能够存储和检索用户的值.HTTP 是一种无状态协议.这意味着 Web 服务器会将针对页面的每个 HTTP 请求作为独立的请求进行处理.服务器不会保留以前的请求过程中所使用的变量值的任何信息. ASP.NET 会话状态将来自限定时间范围内的同一浏览器的请求标识为一个会话,当每个用户首次与这台WWW服务器建立连接时,他就与这个服务器建立了一个Session,同时服务器会自动为其分配一个SessionID,用以标识这个

艾伟_转载:.NET设计模式:工厂方法模式(Factory Method)

概述 在软件系统中,经常面临着"某个对象"的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口.如何应对这种变化?提供一种封装机制来隔离出"这个易变对象"的变化,从而保持系统中"其它依赖该对象的对象"不随着需求的改变而改变?这就是要说的Factory Method模式了. 意图 定义一个用户创建对象的接口,让子类决定实例化哪一个类.Factory Method使一个类的实例化延迟到其子类. 结构图 生活中

艾伟_转载:.NET设计模式:抽象工厂模式(Abstract Factory)

概述 在软件系统中,经常面临着"一系列相互依赖的对象"的创建工作:同时由于需求的变化,往往存在着更多系列对象的创建工作.如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种"封装机制"来避免客户程序和这种"多系列具体对象创建工作"的紧耦合?这就是我们要说的抽象工厂模式. 意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 模型图 逻辑模型: 物理模型: 生活中的例子 抽象工厂的目的是要提供一个创建一系列相关或

艾伟_转载:VS 2010 和 .NET 4.0 系列之《干净的Web.Config文件 》篇

本系列文章导航 VS 2010 和 .NET 4.0 系列之<ASP.NET 4 中的SEO改进 >篇 VS 2010 和 .NET 4.0 系列之<干净的Web.Config文件 >篇 VS 2010 和 .NET 4.0 系列之<起始项目模板>篇 VS 2010 和 .NET 4.0 系列之<多定向支持>篇 VS 2010 和 .NET 4.0 系列之<多显示器支持>篇 VS 2010 和 .NET 4.0 系列之<代码优化的Web开发

艾伟_转载:C#版数据结构之--线性表的链式存储(单链表)

1.单链表的定义和由来: 链表是用一组地址可能连续也可能不连续的存储单元来存储线性表中的数据元素,在存储数据元素时,除了要存储数据元素本身之外,还要存储与它相邻的数据元素的地址信息,这两部分组成了线性表中一个数据元素的映像,称之为"结点",存储数据元素本身的部分称之为:数据域,存储相邻数据元素地址的部分称之为:地址域,所有节点通过地址域链接起来,像一个链条,故用此种方式存储的线性表称之为:链表.如果节点的地址域只存储了数据元素的直接后继的存储地址,则称这种链表为:单链表. 与数序表相比

艾伟_转载:数组排序方法的性能比较(上):注意事项及试验

昨天有朋友写了一篇文章,其中比较了List的Sort方法与LINQ中排序方法的性能,而最终得到的结果是"LINQ排序方法性能高于List.Sort方法".这个结果不禁让我很疑惑.因为List.Sort方法是改变容器内部元素的顺序,而LINQ排序后得到的是一个新的序列.假如两个排序方法的算法完全一致,LINQ排序也比对方多出元素复制的开销,为什么性能反而会高?如果LINQ排序的算法/实现更为优秀,那为什么.NET Fx不将List.Sort也一并优化一下呢?于是今天我也对这个问题进行了简