代码生成工具随笔(3)---占领最后一块黄金宝地
目前代碼生成工具多如繁星,絕大多數(shù)的代碼生成工具都是基于數(shù)據(jù)庫進(jìn)行實(shí)體類、數(shù)據(jù)訪問類、部分業(yè)務(wù)類等的代碼生成,較少會(huì)用來生成易用、重用的界面代碼,因?yàn)檫@塊的邏輯很難控制,每個(gè)人的需求都不一樣,而且把整個(gè)界面和業(yè)務(wù)層結(jié)合一起更是困難。如果界面代碼如果不進(jìn)行封裝,代碼會(huì)多的很難控制。因此很多即使做到界面代碼的生成,也只能做了部分關(guān)鍵界面代碼和后臺(tái)控件賦值的代碼,我的代碼生成工具也做過相關(guān)的工作,由于界面部分總體上不是很理想,一直來都是雞肋,棄之可惜。
?言歸正傳,“占領(lǐng)最后一塊黃金寶地”的意思就是在界面代碼生成這個(gè)領(lǐng)域有了很大的突破,將常用的查詢、分頁、修改、查看和增加等功能用3個(gè)控件(查詢控件、分頁控件、編輯控件)進(jìn)行了封裝,利用我的代碼生成工具Database2Sharp通過與數(shù)據(jù)庫字段的信息結(jié)合,完整的生成一個(gè)網(wǎng)站的界面工程框架,你需要做就是做一些錦上添花的工作就OK,工程越復(fù)雜效率提高就更快。
?先來看看不用編寫代碼而自動(dòng)生成的界面效果吧
主界面包含查詢模塊和信息列表分頁,同時(shí)有查詢、增加、刪除、查看、編輯等按鈕,其中刪除按鈕內(nèi)置了刪除提示,用戶通過實(shí)現(xiàn)委托函數(shù)即可完成;查詢、查看、編輯按鈕的實(shí)現(xiàn)是不需要操心。
新增頁面中可以設(shè)定必填項(xiàng),指定下拉列表等信息,如果必填項(xiàng)為空,那么如下如圖所示的提示信息,這些都是控件實(shí)現(xiàn)的功能,用戶通過實(shí)現(xiàn)保存委托函數(shù)即可實(shí)現(xiàn)數(shù)據(jù)的保存。
編輯信息如下圖所示,和增加頁面相似,但可以設(shè)定只讀項(xiàng)目,只讀項(xiàng)目不可以編輯。
查看頁面也是類似,頁面只有查看按鈕,且數(shù)據(jù)都不可以編輯。
以上4個(gè)場景的頁面是所有Web功能開發(fā)中最常見的功能,如果實(shí)現(xiàn)這些功能您不需要編碼或者只需要編些少代碼就可以實(shí)現(xiàn),那么您就可以從辛勞中解脫,獲得老板更高的贊賞和榮譽(yù)了。
快來吧,使用這三個(gè)控件(查詢、分頁、編輯),通過Database2Sharp輔助,一定可以使你做事事半功倍,節(jié)省些精力和時(shí)間,來陪陪你身邊最關(guān)心你的人吧。
Database2Sharp界面代碼生成功能演示:
1.? 為了配合代碼生成,您需要建立數(shù)據(jù)庫表及為每個(gè)字段添加合適的描述信息,描述文字將作為界面顯示的一部分內(nèi)容。
2.? 下載安裝Database2Sharp最新版本(http://www.iqidi.com/),或者在http://files.cnblogs.com/wuhuacong/Database2SharpSetup.rar?下載,然后使用如圖所示的Web界面代碼生成功能
按照提示一步一步進(jìn)行設(shè)置或者輸入,直到整個(gè)界面生成,最后可以自動(dòng)打開界面工程(生成的是VS2005的工程項(xiàng)目,當(dāng)然這些控件可以應(yīng)用到.NET 1.1中)。
查詢控件屬性說明:?
?NormalFields??????????? 查詢字段屬性集合
?RowControls??每行放置多少控件
?RememberValue??是否記錄控件的值作為下次顯示內(nèi)容
?NormalSortFieldName?排序字段名稱
?ConnectionString?數(shù)據(jù)庫鏈接字符串
?OutSQL???傳出的參數(shù)化SQL語句
?PagerParameters??和參數(shù)化SQL語句對應(yīng)的參數(shù)集合
?ShowAddNew ??是否顯示增加按鈕
?ShowDelete ??是否顯示刪除按鈕
?AppendedButtons??在查詢按鈕附近追加的按鈕
FieldInfo屬性說明:
?FieldName??數(shù)據(jù)庫字段名稱
?ViewName??字段的顯示名稱
?FieldType??字段類型
?DefaultValue??ListItem類型的默認(rèn)值(用于下拉列表)
?TargetFieldName??聯(lián)動(dòng)時(shí)候的字段名稱(用來定位聯(lián)動(dòng)的DropDownList)
?AddItem???用于添加聯(lián)動(dòng)列表內(nèi)容的委托函數(shù)
..........
控件使用說明:
?1.頁面代碼
?2.后臺(tái)代碼?
????private?void?Page_Load(object?sender,?EventArgs?e)????{
????????if?(!IsPostBack)
????????{
????????????FieldInfo?nameInfo?=?new?FieldInfo("Name",?"姓名",?FieldType.String);
????????????FieldInfo?cityInfo?=?new?FieldInfo("City",?"城市",?FieldType.String);
????????????cityInfo.Width?=?100;
????????????cityInfo.DefaultValue?=?new?ListItem[]?{new?ListItem("北京市",?"北京"),?new?ListItem("廣州"),?new?ListItem("成都")};
????????????cityInfo.TargetFieldName?=?"Area";
????????????cityInfo.AddItem?=?new?AddItemHandler(this.AddItem);
????????????FieldInfo?areaInfo?=?new?FieldInfo("Area",?"地區(qū)",?FieldType.String);
????????????areaInfo.DefaultValue?=?new?ListItem[0];
????????????FieldInfo?manInfo?=?new?FieldInfo("Man",?"是否男性",?FieldType.Boolean);
????????????FieldInfo?birthInfo?=?new?FieldInfo("Birthday",?"出生日期",?FieldType.DateTime);
????????????FieldInfo?ageInfo?=?new?FieldInfo("Age",?"年齡",?FieldType.Numeric);
????????????this.HuaweiSearcher.NormalFields?=?new?FieldInfo[]?{nameInfo,?cityInfo,?areaInfo,?manInfo,?birthInfo,?ageInfo};
????????????this.HuaweiSearcher.NormalSortFieldName?=?"ID";
????????????this.HuaweiSearcher.ConnectionString?=?CONNECTION_STRING;
????????????this.HuaweiSearcher.ColumnWidth?=?new?Unit[]{?Unit.Percentage(10),?Unit.Percentage(23),?Unit.Percentage(10),?
??????????????????????????????????????????????????????????Unit.Percentage(23),?Unit.Percentage(10),?Unit.Percentage(23)?};?//設(shè)置列的寬度
????????????this.HuaweiSearcher.LabelHorizontalAlign?=?HorizontalAlign.Right;?//標(biāo)簽對齊方式
????????????BindData();
????????}
????}
????private?void?BindData()
????{
????????this.Pager1.ConnectionString?=?this.HuaweiSearcher.ConnectionString;
????????this.Pager1.PagerParameters?=?this.HuaweiSearcher.PagerParameters;
????????this.Pager1.SQL?=?this.HuaweiSearcher.OutSQL;
????}
????private?void?HuaweiSearcher_OutSQLValueChanged(object?sender,?HuaweiSearcher.OutSQLChangedEventArgs?e)
????{
????????BindData();
????}
????//下拉列表聯(lián)動(dòng)的函數(shù),如選定省份后,地區(qū)跟著變化
????private?void?AddItem(DropDownList?ddListControl,?string?selItemValue)
????{
????????ddListControl.Items.Clear();
????????if?(selItemValue.Trim().Length?>?0)
????????{
????????????string?sql?=?string.Format("select?Area?from?CityArea?where?City?='{0}'?",?selItemValue);
????????????using?(SqlConnection?connection?=?new?SqlConnection(this.HuaweiSearcher.ConnectionString))
????????????{
????????????????connection.Open();
????????????????SqlCommand?com?=?new?SqlCommand(sql,?connection);
????????????????using?(IDataReader?reader?=?com.ExecuteReader())
????????????????{
????????????????????while?(reader.Read())
????????????????????{
????????????????????????ddListControl.Items.Add(new?ListItem(reader["Area"].ToString()));
????????????????????}
????????????????}
????????????}
????????}
????????ddListControl.Items.Insert(0,?new?ListItem("--所有--",?string.Empty));
????}
????
????
????private?void?HuaweiSearcher_OnAddNew()
????{
????????Response.Redirect("Modify.aspx?type=add");
????}
????private?void?HuaweiSearcher_OnDelete()
????{
????????string?idstring?=?Helper.GetDatagridItems(dg);
????????try
????????{
????????????if?(idstring?!=?string.Empty)
????????????{
????????????????string?filter?=?string.Format("ID?in?({0})",?idstring);
????????????????//test.Delete(filter);
????????????????
????????????????Helper.Alerts(this,?idstring);
????????????????return;
????????????}
????????}
????????catch?(Exception?ex)
????????{
????????????Helper.ShowError(this,?ex,?false);
????????????return;
????????}
????????
????????Response.Redirect("Default.aspx");
????}
編輯控件屬性說明:
?EidtFields??新增或者編輯頁面的字段信息
?EntityObject??對應(yīng)的實(shí)體類對象
?ControlType??標(biāo)識(shí)是新增、編輯還是查看已有的數(shù)據(jù),默認(rèn)為新增
?RowControls??每行放置的控件組數(shù)目,默認(rèn)為2個(gè)
?ShowMessageBox??界面輸入轉(zhuǎn)換錯(cuò)誤的時(shí)候,是否顯示對話框,默認(rèn)為True
?ShowErrorAfter??界面輸入轉(zhuǎn)換錯(cuò)誤的時(shí)候,錯(cuò)誤信息是否放在控件的后面,默認(rèn)為false?
?OnCancel??處理取消并返回的委托
?OnSaveData??處理保存數(shù)據(jù)的委托
.........
FieldInfo屬性說明:
?FieldName??數(shù)據(jù)庫字段名稱
?ViewName??字段的顯示名稱
?FieldType??字段類型
?DefaultValue??ListItem類型的默認(rèn)值(用于下拉列表)
?TargetFieldName??聯(lián)動(dòng)時(shí)候的字段名稱(用來定位聯(lián)動(dòng)的DropDownList)
?AddItem???用于添加聯(lián)動(dòng)列表內(nèi)容的委托函數(shù)
?IsRequired ??字段是否必填項(xiàng),默認(rèn)為False (如果是必填項(xiàng),在界面上要求輸入內(nèi)容)
?ToolTip???控件的提示文本(只能設(shè)置文本框的提示)
?Enabled???控件是否可用,默認(rèn)為True
?MaxLength??文本框最大可以輸入的內(nèi)容長度
?TextBoxMode??文本款的呈現(xiàn)模式,可以是SingleLine、MulitLine、Passord類型
?TextRows??多行文本框顯示的行數(shù)
?TextColumns??文本框顯示的列字符數(shù)
控件使用說明:
?1.頁面代碼
?2.后臺(tái)代碼:
????private?const?string?CONNECTION_STRING?=?"Server=localhost;Database=Test;uid=sa;pwd=123456";????private?void?Page_Load(object?sender,?EventArgs?e)
????{
????????if(!this.IsPostBack)
????????{
????????????BindData();
????????}
????????
????????this.EditControl1.OnCancel?=?new?CancelHandler(this.OnCancel);
????????this.EditControl1.OnSaveData?=?new?SaveDataHandler(this.OnSaveData);
????}
????
????private?void?BindData()
????{
????????ControlType?controlType?=?GetControlType();
????????this.EditControl1.ControlType?=?controlType;
????????if(controlType?==?ControlType.Add)
????????{
????????????EditControl1.EntityObject?=?new?TestInfo();
????????}
????????else
????????{
????????????int?id?=?int.Parse(Request.QueryString["ID"]);
????????????EditControl1.EntityObject?=?FindByID(id);
????????}
????????
????????FieldInfo?nameInfo?=?new?FieldInfo("Name",?"姓名",?FieldType.String);
????????nameInfo.IsRequired?=?true;
????????nameInfo.ToolTip?=?"請輸入用戶名稱";
????????if(controlType?!=?ControlType.Add)
????????{
????????????nameInfo.Enabled?=?false;?//設(shè)置“名稱”不可編輯
????????}
????????FieldInfo?cityInfo?=?new?FieldInfo("City",?"城市",?FieldType.String);
????????cityInfo.Width?=?100;
????????cityInfo.DefaultValue?=?new?ListItem[]?{new?ListItem("北京市",?"北京"),?new?ListItem("廣州"),?new?ListItem("成都"),?new?ListItem("武漢"),};
????????cityInfo.TargetFieldName?=?"Area";
????????cityInfo.AddItem?=?new?AddItemHandler(this.AddItem);
????????FieldInfo?areaInfo?=?new?FieldInfo("Area",?"地區(qū)",?FieldType.String);
????????areaInfo.DefaultValue?=?new?ListItem[0];
????????FieldInfo?manInfo?=?new?FieldInfo("Man",?"是否男性",?FieldType.Boolean);
????????manInfo.DefaultValue?=?new?ListItem[]?{new?ListItem("男性",?"True"),?new?ListItem("女性",?"False")};
????????FieldInfo?birthInfo?=?new?FieldInfo("Birthday",?"出生日期",?FieldType.DateTime);
????????birthInfo.IsRequired?=?true;
????????FieldInfo?ageInfo?=?new?FieldInfo("Age",?"年齡",?FieldType.Numeric);
????????this.EditControl1.EidtFields?=?new?FieldInfo[]?{nameInfo,?cityInfo,?areaInfo,?manInfo,?birthInfo,?ageInfo};
????????this.EditControl1.RowControls?=?3;?//默認(rèn)一行放置2個(gè)控件組
????????this.EditControl1.ContentControlWidth?=?Unit.Pixel(180);//統(tǒng)一所有控件的長度
????????this.EditControl1.ColumnWidth?=?new?Unit[]{?Unit.Percentage(10),?Unit.Percentage(20),?Unit.Percentage(10),?
????????????????????????????????????????????????????Unit.Percentage(20),?Unit.Percentage(10),?Unit.Percentage(20)?};?//設(shè)置列的寬度
????}
????
????private?ControlType?GetControlType()
????{
????????ControlType?controlType;
????????string?type?=?Request.QueryString["type"];
????????switch(type)
????????{
????????????case?"view"://查看頁面
????????????????controlType?=?ControlType.View;
????????????????break;
????????????case?"edit"://修改頁面
????????????????controlType?=?ControlType.Edit;
????????????????break;????
????????????default?://增加頁面
????????????????controlType?=?ControlType.Add;
????????????????break;
????????}
????????return?controlType;
????}
????//您可以使用自己的業(yè)務(wù)類來獲取相關(guān)數(shù)據(jù)
????private?object?FindByID(int?id)
????{
????????TestInfo?testInfo?=?new?TestInfo();
????????string?sql?=?string.Format("select?*?from?test?where?id?='{0}'?",?id);
????????using?(SqlConnection?connection?=?new?SqlConnection(CONNECTION_STRING))
????????{
????????????connection.Open();
????????????SqlCommand?com?=?new?SqlCommand(sql,?connection);
????????????using?(IDataReader?reader?=?com.ExecuteReader())
????????????{
????????????????if?(reader.Read())
????????????????{
????????????????????testInfo.ID?=?Convert.ToInt32(reader["ID"]);
????????????????????testInfo.Name?=?reader["Name"].ToString();
????????????????????testInfo.Age?=?Convert.ToInt32(reader["Age"]);
????????????????????testInfo.Area?=?reader["Area"].ToString();
????????????????????testInfo.Birthday?=?Convert.ToDateTime(reader["Birthday"]);
????????????????????testInfo.City?=?reader["City"].ToString();
????????????????????testInfo.Man?=?Convert.ToBoolean(reader["Man"]);
????????????????}
????????????}
????????}
????????return?testInfo;
????}
????private?void?AddItem(DropDownList?ddListControl,?string?selItemValue)
????{
????????ddListControl.Items.Clear();
????????if?(selItemValue.Trim().Length?>?0)
????????{
????????????string?sql?=?string.Format("select?Area?from?CityArea?where?City?='{0}'?",?selItemValue);
????????????using?(SqlConnection?connection?=?new?SqlConnection(CONNECTION_STRING))
????????????{
????????????????connection.Open();
????????????????SqlCommand?com?=?new?SqlCommand(sql,?connection);
????????????????using?(IDataReader?reader?=?com.ExecuteReader())
????????????????{
????????????????????while?(reader.Read())
????????????????????{
????????????????????????ddListControl.Items.Add(new?ListItem(reader["Area"].ToString()));
????????????????????}
????????????????}
????????????}
????????}
????}
????private?void?OnCancel()
????{
????????Response.Redirect("Default.aspx");
????}
????/**////?<summary>
????///?通過返回用戶提交數(shù)據(jù)的實(shí)體類信息,您可以實(shí)現(xiàn)自己的新增保存、修改保存操作
????///?</summary>
????///?<param?name="entity">新增或者修改的實(shí)體類信息</param>
????private?void?OnSaveData(object?entity)
????{
????????if?(this.EditControl1.ControlType?==?ControlType.Add)
????????{
????????????//在此保存新增頁面的數(shù)據(jù)
????????????Response.Write("新增的頁面數(shù)據(jù):<br>");
????????????Response.Write(ReflectionUtil.GetProperties(entity));
????????}
????????else?if(this.EditControl1.ControlType?==?ControlType.Edit)
????????{
????????????Response.Write("編輯的頁面數(shù)據(jù):<br>");
????????????Response.Write(ReflectionUtil.GetProperties(entity));
????????}
????}
相關(guān)文章:
??????代碼生成工具隨筆(1) ---關(guān)于代碼生成器<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
代碼生成工具隨筆(2) ---我的生成工具
轉(zhuǎn)載于:https://www.cnblogs.com/wuhuacong/archive/2007/12/09/988686.html
總結(jié)
以上是生活随笔為你收集整理的代码生成工具随笔(3)---占领最后一块黄金宝地的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 妄自菲薄的反义词
- 下一篇: C# .net IDE Rider入门