使用WinForm演示,重点在于类的使用。

属WinForm小知识系列文章第2篇

最近新文章:C#Winform批量获取CSV内容展示,并保存


目录

演示效果:

正文:

一、控件和类介绍

二、窗体界面和代码

1.Form1窗体界面和代码展示

2.Form2窗体界面和代码展示

三、重点★:3个类的代码

1.Config配置类:

2.FileSerialization序列化类:

3.Entity实体类:

 四、2023/6/28更新补充

新增文本框保存内容

总结


        最近个把月有点忙,写的少了,本来打算这个月写两篇的,结果忙完之后又光顾着玩了,老懒狗了,今天有些空,想了想写啥东西,差不多想了一些就写这个了。


演示效果:

b3fa0ea7e9ea4b6b95d3f839f8ff6ff7.gif

保存路径在运行文件根目录,默认在debug里,实际就根据自己运行配置找到在哪。

        这个功能可以在不开放源码,又需求更改一些标题或显示内容时使用,比如工业上客户要改显示标题内容、与PLC交互的地址可更改等等。


正文:

一、控件和类介绍

d079923b83e74f6bb580bb51525adccc.png

窗体这边使用的是两个窗体,分别为Form1主窗体Form2配置标题内容的窗体

文章使用3个类,分别为:Config配置类FileSerialization序列化类Entity实体类

Config配置类:用来写可配置的标题和内容。

FileSerialization序列化类:要用到的Json内容的相关引用。

Entity实体类:Config配置类和FileSerialization序列化类的“合体”方法,作用是方便在窗体中使用这些方法。

这些看一下就行了。


二、窗体界面和代码

1.Form1窗体界面和代码展示

界面如下:

0a55b09e70f742769ff3069f050a969f.png

代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace MyDemoConfig
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 form2 = new Form2();
            form2.Show();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Entity.ReadConfig();//要先读取配置文件
            lbl_Title.Text = Entity.config.CurrentConfig.Title;//标题
            lbl_Content.Text = Entity.config.CurrentConfig.Content;//内容
        }
    }
}

2.Form2窗体界面和代码展示

界面如下:

872e784c35e240e2b506c954f63e7b54.png

代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace MyDemoConfig
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            //propertyGrid控件内容等于config的配置内容
            this.propertyGrid1.SelectedObject = Entity.config.CurrentConfig;
        }

        //关闭Form2窗体保存配置内容
        private void Form2_FormClosing(object sender, FormClosingEventArgs e)
        {
            Entity.SaveConfig();
        }
    }
}

三、重点★:3个类的代码

1.Config配置类:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MyDemoConfig
{
    public class Config
    {
        public Config()
        {
            CurrentConfig = new CurrentConfig();
        }

        //系统基本参数
        public CurrentConfig CurrentConfig { get; set; }
        
    }

    /// <summary>
    /// 系统参数类
    /// </summary>
    public class CurrentConfig
    {
        [Category("1基本"), DisplayName("标题")] public string Title { get; set; }

        [Category("2基本"), DisplayName("内容")] public string Content { get; set; }
    }
}

2.FileSerialization序列化类:

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MyDemoConfig
{
    /// <summary>
    /// 序列化类(Json)
    /// </summary>
    public class FileSerialization
    {
        /// <summary>
        /// 从类序列化到文件
        /// </summary>
        /// <param name="obj">要序列化的对象</param>
        /// <param name="jsonFile">保存路径</param>
        public static void JsonSerialize(object obj, string jsonFile)
        {
            if (obj == null) return;
            File.WriteAllText(jsonFile, JObject.Parse(JsonConvert.SerializeObject(obj)).ToString());
        }

        /// <summary>
        /// 从文件反序列化到类
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="jsonFile">文件路径</param>
        /// <returns></returns>
        public static T JsonDeserialize<T>(string jsonFile)
        {
            if (!File.Exists(jsonFile)) return default(T);
            return (T)JsonConvert.DeserializeObject<T>(File.ReadAllText(jsonFile));
        }
    }
}

3.Entity实体类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MyDemoConfig
{
    public class Entity
    {

        public static Config config = new Config();

        /// <summary>
        /// 读取文件配置
        /// </summary>
        public static void ReadConfig()
        {
            config = FileSerialization.JsonDeserialize<Config>(AppDomain.CurrentDomain.BaseDirectory + "\\Config.json");
            if (config == null) config = new Config();
        }

        /// <summary>
        /// 保存文件配置
        /// </summary>
        public static void SaveConfig()
        {
            FileSerialization.JsonSerialize(config, AppDomain.CurrentDomain.BaseDirectory + "\\Config.json");
        }
    }
}

 四、2023/6/28更新补充

新增文本框保存内容

在之前Form1主界面放入一个textbox控件,如图所示:

 之后在Config配置类里命名一个公共的string类型变量,这里我默认它为字符串“?”,如图所示:

public string txt { get; set; } = "?";

 之后我们给Form1窗体添加关闭事件FormClosing,在FormClosing事件里写上如图所示代码:

//添加的代码  请选择复制内容
textBox1.Text = Entity.config.txt;

Entity.config.txt = this.textBox1.Text;
Entity.SaveConfig();

 其意思可理解为:在关闭Form1窗体时,配置的txt变量等于我们输入的textbox1的值,也就是把Form1窗体的textbox1控件的值写入JSON文件内保存;

而Form1窗体的Load事件添加的代码是为了每次加载Form1窗体时,我们保存在JSON文件内的数据传值到textbox1控件显示。

大伙理一下应该有所启发,可以把我示例的事件换成别的事件来保存和加载都可以。

最后textbox1控件保存内容的GIF:


总结

主要掌握类的运用,就可引用到其他项目中去。

谢谢观看。

GitHub 加速计划 / js / json
41.72 K
6.61 K
下载
适用于现代 C++ 的 JSON。
最近提交(Master分支:1 个月前 )
960b763e 4 个月前
8c391e04 7 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐