一、首先创建一个XML文件定义以下格式(uName:显示的中文字,uKey:代表控件的Name属性,ukeyValue:代表是否显示)

二、项目中定义一个通用类,来存放读取的值

这三个字段对应XML文件里面的三个属性

三、写一个工具类用来读取XML文件

这样就把XML里面的数据全部取出来放到了刚刚定义的一个通用类集合里面了

四、接下来在窗体里面,我们需要添加一个FlowLayoutPanel容器,用来存放动态添加的控件

对应的后台代码↓↓↓

做完这些,我们运行后就会得到这个页面

五、勾选好需要的选项后,点击保存,保存事件如下:

以上就完成了使用XML作为配置表来保存数据,使用FlowLayoutPanel容器来装载动态添加的控件了。

下面贴出代码:

辅助类

public class XMLs
{
private string name;

public string Name
{
get { return name; }
set { name = value; }
}
private string uKey;

public string UKey
{
get { return uKey; }
set { uKey = value; }
}
private int showcheck;

public int Showcheck
{
get { return showcheck; }
set { showcheck = value; }
}
}

工具类

public class ConfigIsShow
{
public List<XMLs> ShowData()
{
List<XMLs> lx = new List<XMLs>();
//实例化一个XML操作对象
XmlDocument xmldoc = new XmlDocument();
string filen = @"ShowConfig.xml";
//载入xml文件名
xmldoc.Load(filen);
//读取根节点的所有子节点,放到xn0中
XmlNodeList xn0 = xmldoc.SelectSingleNode("person").ChildNodes;
//进行循环赋值
foreach (XmlElement oon in xn0)
{
XMLs ser = new XMLs();
ser.Name = oon.GetElementsByTagName("uName")[0].InnerText;
ser.UKey = oon.GetElementsByTagName("uKey")[0].InnerText;
ser.Showcheck = Convert.ToInt32(oon.GetElementsByTagName("ukeyValue")[0].InnerText);
lx.Add(ser);
}
return lx;
}
}

加载事件

public ConfigIsShow cif = new ConfigIsShow();
public ShowFig()
{
InitializeComponent();
//读取XML文件的数据
List<XMLs> xl = cif.ShowData();
//循环
for (int i = 0; i < xl.Count; i++)
{
//实例化复选框
CheckBox ck = new CheckBox();
ck.Size = new Size(100, 30);//设置宽度和高度
ck.Name = xl[i].UKey;//给Name赋值
ck.Text = xl[i].Name;//给文本赋值
//通过获取的0、1值来判断复选框是否选中
ck.Checked = xl[i].Showcheck == 1 ? true : false;

flowLayoutPanel1.Dock = DockStyle.Fill;//设置控件在容器中自适应
flowLayoutPanel1.Width = 320;
flowLayoutPanel1.Controls.Add(ck); //把复选框添加到容器中
}
this.Controls.Add(flowLayoutPanel1);//将容器添加到主窗体中,否则会覆盖整个窗体
}

保存事件

private void button1_Click(object sender, EventArgs e)
{
string filen = @"ShowConfig.xml";//获取文件路径
var doc = XDocument.Load(filen);//得到文件
foreach (Control ctl in flowLayoutPanel1.Controls)//注意,这边循环的是容器,而不是主窗体
{
if (((CheckBox)ctl).Checked == true)//判断是否选中
{
//首先找主节点person,然后控件的Name找到具体的分节点,再直接给分节点里面的ukeyValue赋值
doc.Element("person").Element(ctl.Name).Element("ukeyValue").Value = "1";
}
else
{
doc.Element("person").Element(ctl.Name).Element("ukeyValue").Value = "0";
}
}
doc.Save(filen);//更新文件
ViewHelper.ShowAutoCloseMsg("设置成功!", 1000);
ShowFig agr = new ShowFig();
agr.Close();
base.Dispose();
}

使用XML作为配置表,WinForm程序读取配置表来动态显示控件的更多相关文章

  1. winform程序读取和改写配置文件App.config元素的值

    winform程序读取和改写配置文件App.config元素的值 2016-05-16 17:49 by newbirth, 2412 阅读, 0 评论, 收藏, 编辑 1 2 3 4 5 6 7 & ...

  2. WPF加载Winform窗体时 报错:子控件不能为顶级窗体

    一.wpf项目中引用WindowsFormsIntegration和System.Windows.Forms 二.Form1.Designer.cs 的 partial class Form1 设置为 ...

  3. C# 向程序新建的窗体中添加控件,控件需要先实例化,然后用controls.add添加到新的窗体中去

    C# 向程序新建的窗体中添加控件,控件需要先实例化,然后用controls.add添加到新的窗体中去 Form settingForm = new Form(); setForm deviceSet ...

  4. WPF 程序如何移动焦点到其他控件

    原文:WPF 程序如何移动焦点到其他控件 WPF 中可以使用 UIElement.Focus() 将焦点设置到某个特定的控件,也可以使用 TraversalRequest 仅仅移动焦点.本文介绍如何在 ...

  5. 利用一个VI写入或读取另一个VI的控件值

    利用一个VI写入或读取另一个VI的控件值(转载自浅浅的小草) 有一个VI,叫未命名1.vi.   还有一个vi,叫未命名2.vi     现在,我在 1.vi里要对2.vi的字符串控件进行写入.  可 ...

  6. C# Winform 通过FlowLayoutPanel及自定义的编辑控件,实现快速构建C/S版的编辑表单页面

    个人理解,开发应用程序的目的,不论是B/S或是C/S结构类型,无非就是实现可供用户进行查.增.改.删,其中查询用到最多,开发设计的场景也最为复杂,包括但不限于:表格记录查询.报表查询.导出文件查询等等 ...

  7. 如何使用AWS和Azure的配置存储服务保存读取配置

    原文:Want to yank configuration values from your .NET Core apps? 作者:pauljwheeler 译文:https://www.cnblog ...

  8. Winform 通过FlowLayoutPanel及自定义的编辑控件,实现快速构建C/S版的编辑表单页面 z

    http://www.cnblogs.com/zuowj/p/4504130.html 不论是B/S或是C/S结构类型,无非就是实现可供用户进行查.增.改.删,其中查询用到最多,开发设计的场景 也最为 ...

  9. [工作札记]03: 微软Winform窗体中ListView、DataGridView等控件的Bug,会导致程序编译失败,影响范围:到最新的.net4.7.2都有

    工作中,我们发现了微软.net WinForm的一个Bug,会导致窗体设计器自动生成的代码失效,这个Bug从.net4.5到最新的.net4.7.2都存在,一直没有解决.最初是我在教学工作中发现的,后 ...

随机推荐

  1. matlab随机系数矩阵产生以及矩阵的可视化函数

    clc; clear all; close all; n = 100;%所产生矩阵的大小 A= sprandsym(n,0.015,0.1,1);%产生系数矩阵函数: spy(A)矩阵图形化相当于im ...

  2. C# 队列Queue,ConcurrentQueue,BlockingCollection 并发控制lock,Monitor,信号量Semaphore

    什么是队列? 队列Queues,是一种遵循先进先出的原则的集合,在.netCore中微软给我们提供了很多个类,就目前本人所知的有三种,分别是标题提到的:Queue.ConcurrentQueue.Bl ...

  3. 使用aspnet_compiler对web程序进行预编译

    前言 本例使用的是asp.net中的webform项目,使用.net框架为.net3.5 操作步骤 正常的web项目发布步骤 发布方法:文件系统 目标位置:发布后的项目文件的路径,可自定义. 打开wi ...

  4. 解决[BScroll warn]: Can not resolve the wrapper DOM. Vue better-scroll

    在开发项目过程中,使用better-scroll插件中遇到了滚动一次重复提示相同错误 [BScroll warn]: Can not resolve the wrapper DOM. Vue bett ...

  5. java中io流实现文件上传下载

    新建io.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" page ...

  6. Java源码系列4——HashMap扩容时究竟对链表和红黑树做了什么?

    我们知道 HashMap 的底层是由数组,链表,红黑树组成的,在 HashMap 做扩容操作时,除了把数组容量扩大为原来的两倍外,还会对所有元素重新计算 hash 值,因为长度扩大以后,hash值也随 ...

  7. sendfile“零拷贝”和mmap内存映射

    在学习sendfille之前,我们先来了解一下浏览器访问页面时,后台服务器的大致工作流程. 下图是从用户访问某个页面到页面的显示这几秒钟的时间当中,在后台的整个工作过程. 如上图,黑色箭头所示的过程, ...

  8. 第13章节 BJROBOT 雷达跟随【ROS全开源阿克曼转向智能网联无人驾驶车】

    雷达跟随说明:注意深度摄像头的 USB 延长线,可能会对雷达扫描造成影响, 所以在雷达跟随前,把深度摄像头的 USB 延长线取下.另外雷达跟随范围大概是前方 50cm 和 120°内扫描到的物体都可以 ...

  9. JedisCluster使用pipeline操作Redis Cluster最详细从0到1实现过程

    公众号文章链接:https://mp.weixin.qq.com/s/6fMsG009RukLW954UUndbw 前言 2020年4月30日,Redis 6.0.0正式发布,标志着redis从此告别 ...

  10. Win Docker 安装C盘清理方法之一

    背景 由于Docker默认安装到C盘,C盘空间越发的小了,虽然(win10)C盘满了并不会很大影响,但是强迫症患者是不能忍得 解决办法 查询https://stackoverflow.com/ques ...