讀取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();
}
}
到此基本的功能實現了。
如有問題和想法請留言。
