在系统开发的过程中,我们总是需要使用配置文件来保存一些我们需要保存的系统参数,毕竟这是.Net时代,如果再使用注册表那就显得复杂了,毕竟操作注册表的API并不是哪么容易理解的。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
所以在.net应用程序中,都默认出现一个App.Config(对于 Web应用程序是Web.Config)我们可以将系统运行所需要的参数采用加密或者明文的方式保存在这个文件中。但是当我们需要大量的,并且有一定逻辑结构的数据,希望也能够保存到配置文件中,此时我们可能这样做:将这些数据构造成DataSet,然后使用DataSet.WriteXML直接写成XML文件,读取的时候直接使用DataSet.LoadXML。另外一种方式就是直接操作XML数据,使用XmlDocument。
第一种方法虽然是好,因为我们可以想操作数据库表一样操作我们的结构化的数据,可是在某些情况下,总觉得怪怪的。并且增加列等等这些的操作觉得及其难受。特别是我们需要使用这些数据的时候,我们首先要去读文档,了解DataSet中的每个表以及每个字段的含义,所以此方法不可取。
那第二种方法呢,这个更不可取。如果我们增加了某个字段,或者修改了数据的机构,那我们的代码修改起来是在也是比较复杂的事情。
那有什么更好的方式来解决这个问题的呢?
既然微软可以使用App.Config和Web.Config,可以使用ComfigManager来对这两个配置文件来进行管理,让我们非常方便地进行使用,那我们为何不可设计自己的ConfigManager呢?
需求:我们这里以菜单结构作为例子来描述我们的想法。
菜单,包括主菜单项,比如系统里面的“文件”,“编辑”等等,包括子菜单,比如“文件”下的“保存”,“另存为”等,子菜单下也包括下级子菜单。总之这是一个完全结构化的数据格式,当然使用菜单来举例主要是这东西我们每天都见到,所以很容易理解,如:
-
publicclassMenu
- {
-
privatestring_Name;
-
privatestring_Text;
-
privatestring_IconName;
-
-
privateSubMenus_SubMenus;
-
-
-
-
publicMenu()
-
:this("","","")
- {}
-
publicMenu(stringname,stringtext,stringiconname)
- {
-
this._Name=name;
-
this._Text=text;
-
this._IconName=iconname;
-
this._SubMenus=newSubMenus();
- }
-
-
-
-
[XmlAttribute("Name")]
-
publicstringName
- {
-
get{returnthis._Name;}
-
set{this._Name=value;}
- }
-
-
-
-
[XmlAttribute("Text")]
-
publicstringText
- {
-
get{returnthis._Text;}
-
set{this._Text=value;}
- }
-
-
-
-
[XmlAttribute("IconName")]
-
publicstringIconName
- {
-
get{returnthis._IconName;}
-
set{this._IconName=value;}
- }
-
-
-
-
publicSubMenusSubMenus
- {
-
get{returnthis._SubMenus;}
-
set{this._SubMenus=value;}
- }
- }
好,那我们菜单项包括子菜单,怎么表示呢?
我们使用一个List来保存我们的子菜单,为了更为直观,我们定义一个SubMenus的类,继承于List<Menu>
-
-
-
-
publicclassSubMenus:List<Menu>
- {
- }
下面我们就来构造我们的菜单MenuStrip。一个MenuStrip中,同样包括多个菜单,比如“文件”“编辑”“视图”等等。
在MenuStrip中,我们提供Load()函数,用于加载我们的菜单数据,提供Save()用于保存我们设置好的菜单数据:
-
publicclassMenuStrip
- {
-
-
privateSubMenus_SubMenus;
-
publicMenuStrip()
- {
-
this._SubMenus=newSubMenus();
- }
-
publicSubMenusSubMenus
- {
-
get{returnthis._SubMenus;}
-
set{this._SubMenus=value;}
- }
-
-
-
-
-
publicMenuStripLoad()
- {
-
MenuStripinstance=newMenuStrip();
-
XmlSerializerxs=newXmlSerializer(typeof(MenuStrip));
-
StreamReadersr=newStreamReader(@"...\Menu.Config");
-
instance=xs.Deserialize(sr)asMenuStrip;
- sr.Close();
-
returninstance;
- }
-
publicvoidSave()
- {
-
XmlSerializerxs=newXmlSerializer(typeof(MenuStrip));
-
StreamWritersw=newStreamWriter(@"...\Menu.Config");
-
xs.Serialize(sw,this);
- sw.Close();
- }
- }
测试代码如下:
-
MenuStripmenustrip=newMenuStrip();
-
-
MenumnuFile=newMenu("mnuFile","文件(&F)","");
-
mnuFile.SubMenus.Add(newMenu("mnuNew","新建",""));
-
mnuFile.SubMenus.Add(newMenu("mnuSave","保存",""));
-
mnuFile.SubMenus.Add(newMenu("mnuSaveAs","另存为",""));
- menustrip.SubMenus.Add(mnuFile);
-
MenumnuEdit=newMenu("mnuEdit","编辑(&E)","");
-
mnuEdit.SubMenus.Add(newMenu("mnuCopy","复制",""));
-
mnuEdit.SubMenus.Add(newMenu("mnuDelete","删除",""));
-
mnuEdit.SubMenus.Add(newMenu("mnuCut","剪切",""));
- menustrip.SubMenus.Add(mnuEdit);
-
menustrip.SubMenus.Add(newMenu("mnuView","视图(&V)",""));
- menustrip.Save();
上面的代码构造了一个配置文件,保存后结果如下:
-
<?xmlversion="1.0"encoding="utf-8"?>
-
<MenuStripxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:xsd="http://www.w3.org/2001/XMLSchema">
-
<SubMenus>
-
<MenuName="mnuFile"Text="文件(&F)"IconName="">
-
<SubMenus>
-
<MenuName="mnuNew"Text="新建"IconName="">
-
<SubMenus/>
-
</Menu>
-
<MenuName="mnuSave"Text="保存"IconName="">
-
<SubMenus/>
-
</Menu>
-
<MenuName="mnuSaveAs"Text="另存为"IconName="">
-
<SubMenus/>
-
</Menu>
-
</SubMenus>
-
</Menu>
-
<MenuName="mnuEdit"Text="编辑(&E)"IconName="">
-
<SubMenus>
-
<MenuName="mnuCopy"Text="复制"IconName="">
-
<SubMenus/>
-
</Menu>
-
<MenuName="mnuDelete"Text="删除"IconName="">
-
<SubMenus/>
-
</Menu>
-
<MenuName="mnuCut"Text="剪切"IconName="">
-
<SubMenus/>
-
</Menu>
-
</SubMenus>
-
</Menu>
-
<MenuName="mnuView"Text="视图(&V)"IconName="">
-
<SubMenus/>
-
</Menu>
-
</SubMenus>
-
</MenuStrip>
您可能会说,这样也不见得很好啊,但是你是否发现,我们就像使用菜单对象一样来操作我们的Menu对象,我们不需要像使用DataSet那样首先要去了解其中每个数据库表的每个字段的含义,也不需要像使用XmlDocument那样去记住每个菜单项的位置。菜单项就是我们的Menu对象,我们可以增加不限级的子菜单,随意遍历我们的菜单等等。
另,通过这样的方式,可以在我们的应用中设计各种各样易于使用修改和维护的结构。
分享到:
相关推荐
在连接Access数据库时,我们需要配置连接字符串,这通常包含在ini配置文件中。连接字符串可能包括以下元素:数据库文件路径、用户名、密码等。 下面是一个简单的C#代码片段,展示如何读取ini配置文件并建立Access...
在C#中,可以使用`ConfigurationManager`类来读取配置文件中的数据。例如,读取`appSettings`中的键值对: ```csharp string setting1 = ConfigurationManager.AppSettings["Setting1"]; ``` 3. **修改配置文件...
在.NET框架中,C#程序员经常需要处理配置文件来存储应用程序的设置或用户偏好。INI文件是一种传统的配置文件格式,通常用于保存简单的键值对数据。在这个场景中,我们有一个名为"ClassLibrary"的压缩包,它包含了一...
在开发过程中,经常会遇到需要从配置文件中读取参数的情况,以便于灵活地调整程序的行为而不必修改代码。本组件专注于解决这个问题,它是一个专门用于从文本配置文件(如ini文件)中读取值的C#组件。 配置文件在...
在C#编程中,应用程序的配置信息通常存储在`app.config`文件中,这是一个XML格式的文件,用于存储应用程序的设置,如连接字符串、API密钥等。`app.config`文件的读取速度是开发者在设计高效应用时需要考虑的一个重要...
在C#的应用中,配置文件扮演着至关重要的角色,它们允许开发者存储和管理应用程序的设置,如数据库连接字符串、API密钥或者用户界面偏好等。本开源组件“C#_编写的自动读写配置文件”正是为了简化这一过程而设计的,...
2. **读取配置文件**:在程序启动时,使用`ConfigurationManager.AppSettings`读取配置文件中的DLL路径。 ```csharp using System.Configuration; string dllPath = ConfigurationManager.AppSettings["DynamicDll...
3. **配置文件操作**:在C#中,可以使用`System.Configuration`命名空间来读写配置文件,如app.config或web.config。程序可能先读取配置文件内容,然后进行加密,最后将加密后的数据写回配置文件。 4. **密钥管理**...
在本《C#应用实例大全》中,您将深入学习C#编程语言的实际应用,涵盖了许多实用的案例,包括但不限于面积体积的计算、系统提示与提醒功能的实现、自定义类的设计以及文件读取操作。这份教程是为那些希望提升C#编程...
在本例中,反射可能用于在运行时根据配置文件中的信息创建相应的类实例。这样,我们可以在不修改代码的情况下更改或扩展系统的行为。 3. **配置文件**: 在C#中,配置文件(如app.config或web.config)用于存储...
根据配置文件中的信息,动态创建并配置Halcon的运算链。 在“第十一讲”中,可能详细讲解了如何实现这一过程。通常,这个部分会涵盖以下内容: 1. XML文件加载:使用C#的FileStream和XmlReader类加载配置文件。 2....
本教程主要探讨如何使用C#创建一个应用程序,将网页镶嵌其中,并最终打包成.exe可执行文件,便于用户在本地桌面环境中运行。 首先,我们需要了解C#中的WebBrowser控件。这个控件允许我们在Windows Forms应用程序中...
例如,如果在配置文件中找到了主题颜色,我们可以用该颜色设置窗体的Background颜色。 最后,为了方便用户,可以添加“恢复默认设置”的功能。这可以通过重置控件的初始值并覆盖配置文件来实现。也可以提供一个...
配置文件(如app.config);以及可能的编译输出(如.exe或.dll)。 在学习和使用这些练习时,你需要了解C#的基础语法,比如变量声明、数据类型、控制结构(如if语句、for循环、while循环)、函数的使用和定义,以及...
在项目" MyFileSystem "中,压缩包很可能包含了源代码文件、资源文件(如图标和图片)、可能还有配置文件。通过分析和学习这些源代码,我们可以进一步了解C#实现文件系统的方法和技术,以及如何将GUI和CLI融合在同一...
**“深入浅出设计模式.pdf”**:这份文件深入讲解了设计模式的概念和具体实现,可能涵盖了23种GOF设计模式,并通过C#代码示例来解释它们在实际项目中的应用。 **“C#.Net网络程序开发-Socket篇.pdf”**:这份文档...
IBatisNet是一个轻量级的持久层框架,它允许开发者将SQL语句直接写在XML配置文件中,与Java或.NET应用的业务逻辑层解耦。这种设计使得SQL语句的维护和调整更为便捷。对于C#开发者来说,能够自动生成与MySQL数据库表...
C#中的皮肤系统允许开发者通过简单的代码或者配置文件,切换不同的ssk文件,从而实现界面的动态变化。这在开发多主题或者需要频繁调整视觉风格的应用时尤其有用。例如,在一款音乐播放器中,用户可以选择不同的皮肤...
首先,它尝试从缓存中获取值,如果缓存中没有,则从配置文件中读取,并将值存入缓存,以提高性能。缓存设置为180分钟过期,过期后需要重新从配置文件加载。 2. `GetConfigBool(string key)`: 此方法返回`...
在项目的AssemblyInfo.cs文件中,修改AssemblyVersion和 AssemblyFileVersion。 8. 部署策略:根据需求,可以选择“始终从网络安装最新版本”或“仅在离线可用时使用离线版本”。前者保证用户始终使用最新版本,后...