一。废话加解释
最近天天给Winform做界面,好烦哦,拖拖拉拉的不喜欢,想偷懒。
偶然发现其实那些画上去的控件其实是被代码在 Form.Desinger.cs里
并且是代码是很相似的,
哈哈哈哈,偷懒计划开始
写一个程序来自动生成这些个代码,然后把直接把代码粘到那个文件里,不就省了很多事嘛
但如果我要后续维护这个界面呢,或是新界面要使用旧有界面的部分代码怎么办呢?
嘿嘿,邪恶的想到的类的序列化!
把平时生成的界面元素类序列化成XML流存到文件里,然后等需要的时候,把这个牛牛的XML文件反序列化回界面生成类,哈哈。
基本思想就是这样了。
二。贴代码:
1 待XML化的类-界面元素类
[XmlRoot("Table")]//未来XML文档的Root元素
public class DataTableInfo
{
//中文表名
[XmlElement("ChineseTableName")]//未来XML文档的元素
private string _cTable = "CTableName";
public string CTableName
{
set { this._cTable = value; }
get { return this._cTable; }
}
//英文表名
[XmlElement("EnglishTableName")]
private string _eTable = "ETableName";
public string ETableName
{
set { this._eTable = value; }
get { return this._eTable; }
}
[XmlElement("Rows")]
public System.Collections.Generic.List<DataBaseInfo.RowInfo> Rows = new List<RowInfo>();
}
public class RowInfo
{
//中文名
[XmlElement("ChineseRowName")]
string _cname = "";
public string CName
{
set { this._cname = value; }
get { return this._cname; }
}
//英文名
[XmlElement("EnglishRowName")]
string _ename = "";
public string EName
{
set { this._ename = value; }
get { return this._ename; }
}
//对应控件类型
[XmlElement("RowControlType")]
private string _ct;
public string ConType
{
set { this._ct = value; }
get { return this._ct; }
}
//是否复选框
[XmlElement("RowHasCheckbox")]
private bool _hc = false;
public Boolean HasCheckbox
{
set { this._hc = value; }
get { return this._hc; }
}
//复选框内容
[XmlElement("RowCheckboxList")]
public System.Collections.Generic.List<RadioType> CheckList = new List<RadioType>();
}
//复选框内容类型
public class RadioType
{
[XmlElement("CheckboxName")]
public string DisplayName;
[XmlElement("CheckboxValue")]
public string Value;
}
2。类 -> XML 文件
public static void WriteXmlFile(string strFile,DataBaseInfo.DataTableInfo di)
{
using (FileStream fs = new FileStream(strFile, FileMode.Create))
{
XmlSerializer formatter = new XmlSerializer(typeof(DataBaseInfo.DataTableInfo));
formatter.Serialize(fs, di);
}
}
3。XML 文件 –> 类
public static DataBaseInfo.DataTableInfo GetObject(System.IO.FileStream fs)
{
DataBaseInfo.DataTableInfo dt;
using (fs)
{
XmlSerializer formatter = new XmlSerializer(typeof(DataBaseInfo.DataTableInfo));
dt = (DataBaseInfo.DataTableInfo)formatter.Deserialize(fs);
}
return dt;
}
等于自动生成的界面代码就不贴了,就是字符串替换。
三。升化
正经的说,兄弟从这里看到什么了没?
设计重于编码!
嘿嘿,如果我把Visio或PD生成的数据库结构导成相应格式的XML文件,
然后我们把该XML文件反序列化成类,嘿嘿,冗烦的画界面元素工作是不是会少一些呢,我们只要定义一些展现的规则,
写个程序根据表描述类生成一个界面的草样,然后人再来整整。那样岂不是很爽,哈哈。
当然只是单表的增删改,如果是多表的或是流程性的,则需要对该序列化类做相应的修改和定义一些类间关联,可做,但没兴趣。
我只为省事哈!