主要思想:xml保存控件的数据,c#读取出来并加以显示。

难点:1.控件有父容器和子控件的关系;2.控件事件的添加。

1.控件有父容器和子控件的关系:

  可以用绝对坐标在xml文件中先读取子控件再读取父容器;

  也可以在子控件属性中设置一个标签记录父容器,然后c#读取时候父容器add子控件。

2.控件事件的添加:

  在控件add完之后也可以对事件进行添加(包括属性更改)。

  为了精确确定某个控件,c#读取到的诸多控件,不建议采用数组包装,用dictionnary省力。

代码:

xml文件:

<?xml version='1.0' encoding='UTF-8'?>
<XmlDataForm Name="ReportSum" Text="报告模板总" ClientSize="1086,1058" DataEntity="">
<Controls>
<Button name="button_firstLang" Location="51,32" Size="38,28" Text="CN" />
<Button name="button_secondLang" Location="96,32" Size="38,28" Text="EN" />
<GroupBox name="groupBox2" Location="188,12" Size="854,58" Text="采图信息" />
<Label name="label1" Location="68,24" Size="32,17" Text="姓名" />
<TextBox name="textBox_name" Location="103,21" Size="120,23" Text="" />
<Label name="label2" Location="229,24" Size="32,17" Text="性别" />
<ComboBox name="comboBox_sex" Location="263,21" Size="45,25" Text="" />
<Label name="label3" Location="313,24" Size="32,17" Text="年龄" />
<TextBox name="textBox_age" Location="348,21" Size="28,23" Text="" />
<Label name="label5" Location="417,24" Size="56,17" Text="采图站点" />
<TextBox name="textBox_site" Location="476,21" Size="92,23" Text="" />
<Label name="label6" Location="572,24" Size="60,17" Text="" />
<TextBox name="textBox_create_date" Location="635,21" Size="137,23" Text="" />
</Controls>
</XmlDataForm>

c#:

public void xmlLoad()
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(@"moban1.xml");
XmlNodeList list_body = xmlDoc.SelectNodes("XmlDataForm");
getControlFromXml(list_body[0]);
this.Width = int.Parse(formWeight);
this.Height = int.Parse(formHeight);
this.Text = formTitle;
foreach (var itemControl in controlsFromXml)
{
Control control = itemControl.Value;
if (control == null) { continue; }
bool addCtrBool = true;
if (control.Tag != null)
{
foreach (var cto in controlsFromXml)
{
Control tempControl = cto.Value;
if (tempControl == null)
{
continue;
}
if (tempControl.Name.Equals(control.Tag.ToString()))
{
tempControl.Controls.Add(control);
addCtrBool = false;
break;
}
} }
if (addCtrBool)
{
this.Controls.Add(control);
}
}
}
     string formWeight;
string formHeight;
string formTitle;
Dictionary<string, Control> controlsFromXml;
public void getControlFromXml(XmlNode xmlNode)
{
formWeight=xmlNode.Attributes["ClientSize"].Value.Split(',')[];
formHeight=xmlNode.Attributes["ClientSize"].Value.Split(',')[];
formTitle=xmlNode.Attributes["Text"].Value;
XmlNodeList list=xmlNode.SelectSingleNode("Controls").ChildNodes;
controlsFromXml = new Dictionary<string, Control>();
for (int i = ; i < list.Count; i++)
{
XmlNode tempXmlNode = list[i];
string className = tempXmlNode.Name;
Assembly assembly = Assembly.LoadFrom(@"System.Windows.Forms.dll");
if (className != null&&!className.Contains("#")&&className!="")
{
Type type = assembly.GetType(@"System.Windows.Forms."+className);
object obj = Activator.CreateInstance(type);
Control control = (Control)obj;
control.Left = int.Parse(tempXmlNode.Attributes["Location"].Value.Split(',')[]);
control.Top = int.Parse(tempXmlNode.Attributes["Location"].Value.Split(',')[]);
control.Width = int.Parse(tempXmlNode.Attributes["Size"].Value.Split(',')[]);
control.Height = int.Parse(tempXmlNode.Attributes["Size"].Value.Split(',')[]);
control.Name = tempXmlNode.Attributes["Name"].Value;
if (tempXmlNode.Attributes["Father"] != null)
{
control.Tag = tempXmlNode.Attributes["Father"].Value; }
if (tempXmlNode.Attributes["Text"]!= null)
{
control.Text = tempXmlNode.Attributes["Text"].Value;
}
controlsFromXml.Add(control.Name,control);
}
}
}

c# 读取xml文件 编写form的更多相关文章

  1. C# 读取XML文件示例

    有关XML文件编写规范,请参考:http://www.w3school.com.cn/xml/index.aspXML内容如下(文件名为:Information.xml):浏览器显示: <?xm ...

  2. Android 开发自己的网络收音机4——读取XML文件的电台数据

    国内外的电台数据很多,起码有好几百,所以把这些数据都写到代码里面是不实际的.只能写成一个数据文件,程序启动的时候再去加载.保存这些简单数据,我们肯定会优先使用XML文件,今天讲讲如何读取XML里面的数 ...

  3. Loadrunner脚本读取 XMl 文件

    Loadrunner脚本读取 XMl 文件 性能测试工程师要懂代码么?答案是必须的,好多测试员认为在 loadrunner 中编写脚本很难很牛 X . 好多人认为 loadrunner 只支持 C 语 ...

  4. C#读取xml文件写入到TreeView中

    开发过程中我们会遇到一些读取xml文件的时候,下面是我学习的整理. 用XmlDocument读取加载 XmlDocument doc = new XmlDocument(); doc.Load(&qu ...

  5. ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现

    ASP.NET MVC 学习笔记-2.Razor语法   1.         表达式 表达式必须跟在“@”符号之后, 2.         代码块 代码块必须位于“@{}”中,并且每行代码必须以“: ...

  6. jQuery、JS读取xml文件里的内容(JS先通过document.implementation.createDocument方法将xml转换成document对象,jQuery将读取到的xml转成table)

    xml文件:test.xml <?xml version="1.0"?> <note> <to>George</to> <fr ...

  7. C#中常用的几种读取XML文件的方法

    1.C#中常用的几种读取XML文件的方法:http://blog.csdn.net/tiemufeng1122/article/details/6723764/

  8. 读取xml文件报错:Invalid byte 2 of 2-byte UTF-8 sequence。

    程序读取xml文件后,系统报“Invalid byte 2 of 2-byte UTF-8 sequence”错误,如何解决呢? 1.程序解析xml的时候,出现Invalid byte 2 of 2- ...

  9. C#读取XML文件的基类实现

    刚到新单位,学习他们的源代码,代码里读写系统配置文件的XML代码比较老套,直接写在一个系统配置类里,没有进行类的拆分,造成类很庞大,同时,操作XML的读写操作都是使用SetAttribute和node ...

随机推荐

  1. 在centos6.7通过源码安装python3.6.7报错“zipimport.ZipImportError: can't decompress data; zlib not available”

    在centos6.7通过源码安装python3.6.7报错: zipimport.ZipImportError: can't decompress data; zlib not available 从 ...

  2. 分页插件pagehelper ,在sql server 中是怎么配置的

    <configuration> <plugins> <!-- com.github.pagehelper为PageHelper类所在包名 --> <plugi ...

  3. 微信网页授权,错误40163,ios正确,安卓错误?

    2017-07-29:结贴昨天研究了半天,也没解决,看到出错的http头里面有PHPSESSID,回头去修改了一下程序里的session部分的代码(这部分代码在微信网页授权之后),,也不知道是腾讯那边 ...

  4. Set的源码分析

    Set的内部实现其实是一个Map.即HashSet的内部实现是一个HashMap,TreeSet的内部实现是一个TreeMap,LinkedHashSet的内部实现是一个LinkedHashMap. ...

  5. mysql 库和表占用空间查询

    1. 查看该数据库实例下所有库大小,得到的结果是以MB为单位 as sum from information_schema.tables; 2.查看该实例下各个库大小 as total_mb, as ...

  6. 【NXP开发板应用—智能插排】4. PWM驱动

    [前言] 首先感谢深圳市米尔科技有限公司举办的这次活动并予以本人参加这次活动的机会,以往接触过嵌入式,但那都是皮毛,最多刷个系统之类的,可以说对于嵌入式系统开发这件事情是相当非常陌生的,这次活动为我提 ...

  7. python2x和python3x的一些区别

    python2x:各种按照自己代码习惯给python贡献源码 python3x:重写之后的源码,优美,清晰,简单 版本 打印函数 rang函数 输入函数 python2x print 或 print( ...

  8. php7+apache2.4+mysql 环境配置(window环境)

    最近,小主从事PHP开发.特将最近如何搭建php7的过程记录在此!希望有需要,可以借鉴!( 电脑必须win7 sp1以上, .netframework4 ) Windows7安装php7,Win7+p ...

  9. 【转】odoo 新API装饰器中one、model、multi的区别

    http://blog.csdn.net/qq_18863573/article/details/51114893 1.one装饰器详解 odoo新API中定义方式: date=fields.Date ...

  10. SpringBoot-04:SpringBoot在idea中的俩种创建方式

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 创建SpringBoot工程有很多种方式,我只讲俩种最为常见的 一,依托springboot官网提供的模板.( ...