读取Excel 表创建表(不再读取Excel后创建功能代码,而是先创建数据库表)。在设计工具中选择对应的表,加载表的时候显示主键,用*号标识出来。
如果是多表则选择对应的关联字段。
选择序时簿上要查询的对应字段。
主窗体上的字段对应的控件类型,字段名称。 可以设定目标字段的参照,SQL,CODE,测试参照效果,参照支持列查询。
在主窗体上添加GridControl 。关联Grid 的加载SQL语句,显示字段以及名称。可以实现多个GridControl。
业务:首先是查询列表,列表要展示的数据列,列表查询要显示的条件。
包含列表窗体:显示的字段 双击弹出主窗体 自动生成查询语句。
查询窗体:查询执行,查询条件记忆。
导出Excel:用户可以自己设定导出Excel 字段。
单表维护生成。只用GridControl 维护的。
将DBClass 集成到解决方案中来。 可以选择生成对应的单表,可以选择生成多表。
将代码生成器解决方案添加到解决方案中去。
主窗体:
1. lable+控件。在Excel 表格FControlType 中指定对应的控件类型。控件的Name对应到字段。
2. 字段的赋值映射。BundingFile,以;隔开。此处一般是在参照的时候用到。举例,当选择物料编码的时候,生成物料,将名称,规格等字段一并赋值。
在此操作过程中,我们将物料编码称之为目标字段。目标字段对应的参照映射SQLCODE。加载的字段和数据
注:SQLCODE 是在数据库的一个表中。对应的查询检索语句。有字段编码和字段Caption(Text).
3. 主窗体包含GridControl 。保存和修改用批处理方法。批处理方法用到的关键字需要在表格中设定好。
4.主窗体中其他控件用ORM映射。将约束好的字段和数据库中的字段对应上。
5. 新增 工具栏新增按钮弹出新增窗体。
6. 修改 根据Keyvalue 对窗体数据进行修改
7. 删除 根据Keyvalue 删除对应的窗体数据
8. 审核 根据Keyvalue 审核对应的数据
9. 反审核 根据Keyvalue 反审核对应的数据
10.上一条
11.下一条
12. 复制 根据Keyvalue 反射审核对应的数据
做这个工具首先要了解下winForm Designer.cs 文件。在这个设计器文件里包含了控件的布局,类型,对象声明,添加到容器中。
源码下载地址:https://pan.baidu.com/s/1o8rmnb0
一个Form窗体有三个文件,代码里封装了三个方法,分别对这三个文件进行处理,(实现了一个方法)目前我处理的是Design.cs文件。
控件上有标题和文本框。首先自定义一个简单的控件吧。

自定义控件代码如下:(直接截图了,代码都在源码里可以下载看得到)(后面我会把自定义相对复杂的控件写成博文)

控件定义好了之后,就写自动生成器的代码吧。 生成效果如图:

工具主界面:标红的地方是实现的部分,后续会不断的完善,希望大家提出意见,一起来完善。

首先:要选择生成文件的Excel模板,这个模板里包含了如图:
FColName 控件名称 FColType 字段类型 FColNote label显示的名称 FControlType 0 代表的是自定义的Text控件 之后会把可能涉及的控件维护上去。

其次,选择文件的生成路径,就是把生成的Form文件放到指定的文件夹中。
最后,点击创建按钮。
代码分析:
创建文件:读取Excel 表。

读取Excel表 这里的源代码可以复制,功能就是把Excel 表当成数据库表读取,其实任何文件都可以看成数据库。因为数据库就是文件。
/// <summary>
/// 读取Excel 表
/// </summary>
/// <returns></returns>
public DataTable GetExcelTable()
{
string strConn = "Provider=Microsoft.Ace.OleDb.12.0;" + "data source=" + txtFilePath.Text.Trim() + ";Extended Properties='Excel 12.0; HDR=Yes; IMEX=1'";
OleDbConnection conn = new OleDbConnection(strConn);
conn.Open();
// DataTable schemaTable = conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, null);获取Sheet列表
OleDbDataAdapter adp = new OleDbDataAdapter("Select * from [Sheet1$]", conn);
DataSet ds = new DataSet();
adp.Fill(ds);
return ds.Tables[0];
}
读取并创建Designer.cs文件
void ReadDesignerFile(DataTable dt, string _FileName)
{
string _Temppath = Application.StartupPath + @"\TempleFileWinForm\billHead\Form1.Designer.cs";
//首先读取文件 将文件读取到 字符串中
string contents = System.IO.File.ReadAllText(_Temppath);
StringBuilder strbuilder = new StringBuilder();
string line = Environment.NewLine;//换行符
strbuilder.Append(contents);//获取文件读取到StringBuilder中
int _RowCount = dt.Rows.Count;
if (dt.Rows.Count > 0)
{
string _FieldName = "";
string _FieldText = "";
string _prefix = "";
int _x = 0, _y = 0, _Tabindex = 210;
string _ControlType = "";
for (int c = 0; c < _RowCount; c++)
{
_x = 20 + c % 4 * 250;//计算控件在X轴位置
if (c % 4 == 0)
{
_y = 20 + 32 * c / 4;//计算控件在Y轴的位置
}
_Tabindex = c % 4 + c / 4 + _Tabindex;
//多控件类型 这边可以根据具体的需求进行控件的扩展
switch (dt.Rows[c]["FControlType"].ToString())
{
case "0":
_prefix = "txt";
_FieldName = dt.Rows[c]["FColName"].ToString();
_FieldText = dt.Rows[c]["FColNote"].ToString();
_ControlType = "labTextBox";
break;
}
string _ControlName = _prefix + _FieldName;
//BQSetControlObject 实例化控件
string BQSetControlObject = "BQSetControlObject" + line + "this." + _ControlName + " = new BQlabTextBox." + _ControlType + "();" + line;
strbuilder.Replace("BQSetControlObject", BQSetControlObject);
//创建对象结束后 this.SuspendLayout();
//BQSetControlInfo 设置控件信息 位置 大小 名称
string _ControlName02 = "\"" + _ControlName + "\"";//给控件Text 赋值的是带有双引号的字符串 因此这个里要特殊处理下
string _FieldName02 = "\"" + _FieldName + "\"";
string _FieldText02 = "\"" + _FieldText + "\"";
string BQSetControlInfo = "BQSetControlInfo" + line
+ "//" + line
+ "//" + _ControlName + line
+ "//" + line
+ "this." + _ControlName + ".Location = new System.Drawing.Point(" + _x + ", " + _y + ");" + line//位置
+ "this." + _ControlName + ".Name = " + _ControlName02 + ";" + line//给Name赋值
+ "this." + _ControlName + ".Size = new System.Drawing.Size(225,21);" + line//大小
+ "this." + _ControlName + ".TabIndex = " + _Tabindex + ";" + line
+ "this." + _ControlName + ".Tag = " + _FieldName02 + ";" + line//Tag值
+ "this." + _ControlName + ".LBLText = " + _FieldText02 + ";" + line;//给自定的label控件赋值
strbuilder.Replace("BQSetControlInfo", BQSetControlInfo);
//BQAddControltoMContainer//将控件添加到Form 容器中 这个容器可以是 panel 可以是groupbox 等等
string BQAddControltoMContainer = "BQAddControltoMContainer" + line + " this.Controls.Add(this." + _ControlName + ");" + line;
strbuilder.Replace("BQAddControltoMContainer", BQAddControltoMContainer);
//BQCreateConrolObejct //创建控件
string BQCreateConrolObejct = "BQCreateConrolObejct" + line + "private BQlabTextBox." + _ControlType + " " + _ControlName + ";" + line;
strbuilder.Replace("BQCreateConrolObejct", BQCreateConrolObejct);
}
System.IO.File.Delete(txtCreateDBPath.Text + "\\" + _FileName + ".Designer.cs");
string path = txtCreateDBPath.Text;
System.IO.StreamWriter sw = System.IO.File.CreateText(path + "\\" + _FileName + ".Designer.cs");
sw.Write(strbuilder.ToString());
sw.Close();
sw.Dispose();
}
}
到此基本的功能实现了。
如有问题和想法请留言。
