C#学习笔记之Winform XML配置文件

在Winform里我们有时侯需要记录程序的密码,按钮属性什么的。这些都是一些小数据,没有必要建一个用数据库表来存储,但是每次打开程序都要重新配置又太过于麻烦。所以我就特地了解了一下用XML文件来记录程序配置信息。主要还是学习XML的读取与写入。

1,XML的读取。

我们来看一个简单的XML文件。

<?xml version="1.0" encoding="UTF-8"?>
<setup>
  <dt enable0="1" enable1="1" enable2="0" />
</setup>

XML 是树结构的,虽然我的这个例子有点简单不能完全展示出XML的结构,但并不影响对XML的使用。对XML深入讲解的博文有很多,有需要的同学可以在园里一搜一大把,我也是从很多前辈的博文中一点一点的学习积累的,毕竟学习真正靠的还是自己。在我的例子里setup是根元素,dt是唯一的子元素,enable0,enable1,enable2是dt的属性。在xml里可以用属性来记录信息也可以用元素内容来记录信息 ,根据不同的需求来做出选择或搭配使用。在我们的例子里只需用属性就可以了。  我们用“0”,“1”来记录winform中chekebox的状态。

 XmlDocument doc = new XmlDocument();//创建一个XML文档
                XmlReaderSettings settings = new XmlReaderSettings();//设置读取XML时的属性。
                settings.IgnoreComments = true;//XML忽略注释。
          
                XmlReader xmlReader = XmlReader.Create(path, settings);//实例化一个XmlReader对象,解析XML文件
                doc.Load(xmlReader);//从指定的 XmlReader 加载 XML 文档。
                XmlNode xml = doc.SelectSingleNode("setup");//读取根元素下的子元素集合
                XmlNode node = xml.ChildNodes[0];//取仅有的一个元素
                XmlElement element = (XmlElement)node;//为了可以使用属性存储信息,我们把XmlNode转化为XmlElement。

path 为XML文件的地址。settings用来设置读取XML文档时忽略里边的注释。

2,XML 的写入

 XmlDocument document = new XmlDocument();
                document.AppendChild(document.CreateXmlDeclaration("1.0", "UTF-8", null));
                XmlElement root = document.CreateElement("setup");
                document.AppendChild(root);
                XmlElement xmldata = document.CreateElement("dt");
                for (int i = 0; i < intlist.Count; i++)
                {
                    xmldata.SetAttribute("enable" + i, intlist[i].ToString());
                }

                root.AppendChild(xmldata);

                document.Save(path);

document.CreateXmlDeclaration("1.0", "UTF-8", null)创建XML 声明。它定义 XML 的版本(1.0)和所使用的编码(UTF-8 : 万国码, 可显示各种语言)。 使用AppendChild将创建的元素加入到XML文档中,    用XmlElement的SetAttribute创建属性。这里有点类似于NJ.Linq里创建 JSON对象。最后保存即可。

   

3,程序配置

我们先创建一个Form窗体Setup。

using System;
using System.Collections.Generic;
using System.Windows.Forms;


namespace CredentialGenerator
{
    public partial class Setup : Form
    {
        Setupclass setupclass = new Setupclass();
        MainForm mainform;
        public MainForm mainForm { get => mainform; set => mainform = value; }
        List<bool> ConditionsList = new List<bool>();
        public Setup()
        {
            InitializeComponent();
           
            Setupclass setupclass = new Setupclass();
                if (setupclass.InitializeSetup("enable0") == 0)
                {
                    enablefalse.Checked = true;
                }
                else
                {
                    enabletrue.Checked = true;
                }


                if (setupclass.InitializeSetup("enable1") == 0)
                {
                    conditionsfalse.Checked = true;
                }
                else
                {

                    conditionstrue.Checked = true;
                }


                if (setupclass.InitializeSetup("enable2") == 0)
                {
                    dateradiofalse.Checked = true;
                }
                else
                {

                    dateradiotrue.Checked = true;
                }


            if (setupclass.InitializeSetup("enable3") == 0)
            {
                LogcheckBox.Checked = false;
            }
            else
            {

                LogcheckBox.Checked = true;
            }

            if (setupclass.InitializeSetup("enable4") == 0)
            {
                Emptytablefals.Checked = true;
            }
            else
            {

                Emptytabletrue.Checked = true;
            }
            use.Enabled = false;

        }
       


        private void savebutton_Click(object sender, EventArgs e)
        {
            Close();            
        }
       
      
        private void use_Click(object sender, EventArgs e)
        {
            ConditionsList.Add(enabletrue.Checked);
            ConditionsList.Add(conditionstrue.Checked);
            ConditionsList.Add(dateradiotrue.Checked);            
            ConditionsList.Add(LogcheckBox.Checked);
            ConditionsList.Add(Emptytabletrue.Checked);
            setupclass.Save(ConditionsList);           
            mainForm.bh();
            if (Emptytabletrue.Checked)
            {
                mainForm.SetEmptytable();
            }
            else
            {
                mainForm.Setnulltable();
            }
            ConditionsList.Clear();
            use.Enabled = false;


        }

        public void change()
        {
            use.Enabled = true;
            int enable ;
            int conditions ;
            int dateradio ;
            int log;
            int nulltable;
            if (enablefalse.Checked)
            {
                enable = 0;
            }
            else
            {
                enable = 1;
            }
            if (conditionsfalse.Checked)
            {
                conditions = 0;
            }
            else
            {
                conditions = 1;
            }
            if (dateradiofalse.Checked)
            {
                dateradio = 0;
            }
            else
            {
                dateradio = 1;
            }
            if (LogcheckBox.Checked)
            {
                log = 0;
            }
            else
            {
                log = 1;
            }

            if (Emptytablefals.Checked)
            {
                nulltable = 0;
            }
            else
            {
                nulltable = 1;
            }
            if (enable.Equals( setupclass.InitializeSetup("enable0")) && conditions.Equals(setupclass.InitializeSetup("enable1")) 
                && dateradio.Equals(setupclass.InitializeSetup("enable2")) && !log.Equals(setupclass.InitializeSetup("enable3"))
                &&nulltable.Equals(setupclass.InitializeSetup("enable4")))
            {
                use.Enabled = false;
            }
            
            

        }

      

   
        private void radio_CheckedChanged(object sender, EventArgs e)
        {
            change();
        }
        private void LogcheckBox_CheckedChanged(object sender, EventArgs e)
        {
           
            change();
        }
    }
   
         
    
         
    

}
View Code

在Winform的代码里我还做了一些处理,每次改变RadioButton的属性,都会随时监测XML,只有当至少有一个RadioButton的属性发生变化时,“应用”按钮才能点击。

接下来就是把上面XML的读取和写入整合到一个类里。

using System.Collections.Generic;
using System.Windows.Forms;
using System.Xml;
using static System.Convert;

namespace CredentialGenerator
{
    public  class Setupclass
    {
        
        string path = Application.StartupPath + @"\setupconfig.xml";
        public  int InitializeSetup(string enble)
        {
           
            int InitializeEnable = 0;
         
                XmlDocument doc = new XmlDocument();//创建一个XML文档
                XmlReaderSettings settings = new XmlReaderSettings();//设置读取XML时的属性。
                settings.IgnoreComments = true;//XML忽略注释。
            try
            {
                XmlReader xmlReader = XmlReader.Create(path, settings);//实例化一个XmlReader对象,解析XML文件
                doc.Load(xmlReader);//从指定的 XmlReader 加载 XML 文档。
                XmlNode xml = doc.SelectSingleNode("setup");//读取根元素下的子元素集合
                XmlNode node = xml.ChildNodes[0];//取仅有的一个元素
                XmlElement element = (XmlElement)node;//为了可以使用属性存储信息,我们把XmlNode转化为XmlElement。

                InitializeEnable =(ToInt32(element.GetAttribute(enble).ToString()));
                xmlReader.Close();
            }
            catch 
            {
              
            }
           

            return InitializeEnable;

        }

        
        public void Save(List<bool> boollist)
        {
            List<int> intlist = new List<int>();
            
            foreach (var item in boollist)
            {
                if (item)
                {
                    intlist.Add(1);
                }
                else
                {
                    intlist.Add(0);
                }
            }

            try
            {
                XmlDocument document = new XmlDocument();
                document.AppendChild(document.CreateXmlDeclaration("1.0", "UTF-8", null));
                XmlElement root = document.CreateElement("setup");
                document.AppendChild(root);
                XmlElement xmldata = document.CreateElement("dt");
                for (int i = 0; i < intlist.Count; i++)
                {
                    xmldata.SetAttribute("enable" + i, intlist[i].ToString());
                }

                root.AppendChild(xmldata);

                document.Save(path);
            }
            catch
            {

            }
        }
    }
}

Application.StartupPath,获取启动了应用程序的可执行文件的路径,不包括可执行文件的名称。可以以程序目录为生成配置文件的地址。将程序打包安装到其他环境,我们直接在安装目录里就可以找到配置文件了。学无止境!

猜你喜欢

转载自www.cnblogs.com/xwzLoveCshap/p/9291435.html