界面開發,無論對于Web開發,還是Winform開發,都需要耗費一定的時間,特別對于一個數據庫字段比較多的界面,一般就需要在編輯界面上擺的更多的控件來做數據顯示,每次碰到這個,都有點頭痛,反復的機械操作讓人挺累,也很煩,但是又必須這樣做。
由于數據庫字段和界面的排版都有一定的關聯關系,因此可以通過代碼生成工具Database2Sharp的數據庫元數據,包含表名稱、備注信息、字段列表,以及每個字段的名稱、備注、類型等信息,構造一個基礎的界面,把重復機械的部分給快速完成,這就是我所說的界面快速生成。當然,對于精致的界面,機械的生成肯定不能滿足我們的需要,因此真正的界面需要在這個基礎上修改完善一下,但是由于重復勞動部分,已經給工具處理掉了,因此,界面開發效率會大大提高。
1、基于Web界面的快速生成
基于EnterpriseLibray架構的代碼生成,除了可以生成傳統的業務層、數據訪問層、數據訪問接口層、實體層外,還同時生成了Web界面工程,Web界面工程已經添加了相關的引用程序集及必須的控件,生成后即可編譯運行,一些表字段設計合理的話,甚至不用修改一行代碼就能直接使用,如下所示。
生成后的項目界面截圖如下所示。
以下是TB_ItemDetail表生成的界面,沒有修改過任何東西,列表頁面呈現的效果。
其中編輯及查看頁面也生成了,直接單擊連接就可以看到效果,如下圖所示。
?
這些效果是很基本的界面布局了,如果需要更好看的,可以根據需要調整下每行的數量,以及顯示方式。這樣的效果,雖然不算最好看,但是已經幫我們把界面元素弄起來了,我們后面的工作就很好開展,不用再重復添加每個字段對應的控件布局信息了。具體的代碼是標準的HTML控件代碼如下所示。
<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" Inherits="Pages_ItemDetail_EditItemDetail" Codebehind="EditItemDetail.aspx.cs" %><asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server"><h3 id="h_title" align="center" runat="server">編輯備件信息表 </h3><table class="formitem" cellspacing="1" cellpadding="0" align="Center" border="0"style="border-width: 0px; width: 98%;"><caption>基本信息</caption> <tr style="width: 100%;"><th align="left" style="width: 20%;">備件編號 :</th><td style="width: 80%;" colspan="3"> <asp:TextBox ID="txtItemNo" runat="server" Width="250px" MaxLength="100"></asp:TextBox></td></tr><tr style="width: 100%;"><th align="left" style="width: 20%;">備件名稱 :</th><td style="width: 80%;" colspan="3"> <asp:TextBox ID="txtItemName" runat="server" Width="250px" MaxLength="100"></asp:TextBox></td></tr><tr style="width: 100%;"><th align="left" style="width: 20%;">供貨商 :</th><td style="width: 80%;" colspan="3"> <asp:TextBox ID="txtManufacture" runat="server" Width="250px" MaxLength="100"></asp:TextBox></td></tr>
...............
當然后臺代碼的保存及賦值顯示,肯定是少不了的了,這些也是根據我的框架代碼生成的,應該來說是很有用的。
public partial class Pages_ItemDetail_EditItemDetail : BasePage {protected override void OnInit(EventArgs e){base.OnInit(e);this.IsFunctionControl = true;this.FunctionID = "ItemDetail/Edit";}private void BindData(){try{string id = Request.QueryString["ID"];if(!string.IsNullOrEmpty(id)){ItemDetailInfo info = BLLFactory<ItemDetail>.Instance.FindByID(id);if(info != null){this.txtItemNo.Text = info.ItemNo;this.txtItemName.Text = info.ItemName;this.txtManufacture.Text = info.Manufacture;this.txtMapNo.Text = info.MapNo;this.txtSpecification.Text = info.Specification;this.txtMaterial.Text = info.Material;this.txtItemBigType.Text = info.ItemBigType;this.txtItemType.Text = info.ItemType;this.txtUnit.Text = info.Unit;this.txtPrice.Text = info.Price.ToString();this.txtSource.Text = info.Source;this.txtStoragePos.Text = info.StoragePos;this.txtUsagePos.Text = info.UsagePos;this.txtNote.Text = info.Note;this.txtWareHouse.Text = info.WareHouse;this.txtDept.Text = info.Dept;}}}catch(Exception ex){Helper.ShowError(this, ex, false);return;}}protected void Page_Load(object sender, EventArgs e){ if(!this.IsPostBack){BindData();}}/// <summary>/// 獲取數據/// </summary> private ItemDetailInfo SetData(ItemDetailInfo info){ info.ItemNo = this.txtItemNo.Text; info.ItemName = this.txtItemName.Text; info.Manufacture = this.txtManufacture.Text; info.MapNo = this.txtMapNo.Text; info.Specification = this.txtSpecification.Text; info.Material = this.txtMaterial.Text; info.ItemBigType = this.txtItemBigType.Text; info.ItemType = this.txtItemType.Text; info.Unit = this.txtUnit.Text; info.Price = Helper.SafeConvertDecimal(this.txtPrice.Text);info.Source = this.txtSource.Text; info.StoragePos = this.txtStoragePos.Text; info.UsagePos = this.txtUsagePos.Text; info.Note = this.txtNote.Text; info.WareHouse = this.txtWareHouse.Text; info.Dept = this.txtDept.Text; return info;}protected void imgSubmit_Click(object sender, ImageClickEventArgs e){try{string id = Request.QueryString["ID"];if(string.IsNullOrEmpty(id)){ItemDetailInfo info = new ItemDetailInfo();SetData(info);BLLFactory<ItemDetail>.Instance.Insert(info);}else{ItemDetailInfo info = BLLFactory<ItemDetail>.Instance.FindByID(id);if(info != null){SetData(info);BLLFactory<ItemDetail>.Instance.Update(info, id);}}}catch(Exception ex){Helper.ShowError(this, ex, false);return;}Response.Redirect("ListItemDetail.aspx");}protected void imgBack_Click(object sender, ImageClickEventArgs e){Response.Redirect("ListItemDetail.aspx");} }
有了這些智能的界面生成,界面開發其實是一件不再枯燥的事情,節省更多的時間,做更有意義的事情。
2、基于DevExpress的Winform界面快速生成
除了Web的界面開發,Winform的界面開發,當然也很重要,枯燥的事情一樣可以交給代碼生成工具Database2Sharp進行生成,不需要讓人工反復的做這些無用功,或者是技術含量不太高的東西。
上面Web界面工程,我是采用SQLServer的數據庫進行生成代碼的,這個例子,我們介紹一下Oracle數據庫的生成方式,其實這個代碼生成工具,對應用什么數據庫不重要,都會很好的給你生成相關的界面信息,不管你是用SQLServer還是Oracle,或者是Sqlite、Access、MySql等等,都一樣可以很好的生成所需的開發代碼的。
工具生成了界面布局代碼,以及界面后臺邏輯代碼,這樣的代碼正是我們開發所需要的,我們看到生成后的界面代碼(沒有修改代碼的),在VS里面的真實效果如下。
上面的布局采用了LayoutControl來進行布局控制,這是一種很好的布局控制方法,它除了使得界面更加美觀外,還能非常自由調整每個控件的位置及大小。
當然,我們一般為了美觀需要,會對界面進行一定的調整,由于DevExpress控件類型變化切換很方便,所以這種調整很自由高效,調整后的界面如下所示。
比起十幾秒鐘弄好一個界面,純手工做這樣的界面,沒有十幾分鐘,估計弄不好的,而且容易出錯,最重要的問題,就是團隊開發的時候,這個統一性就很有保證,開發效率高,帶來Bug也會很少。
3、基于傳統的Winform界面快速生成
?傳統的Winform界面和DotNetBar樣式的界面生成,和上面的DevExpress樣式代碼很類似,不過控件不同而已,由于不同的需要,用傳統界面元素開發,也是一種常見的開發模式,因此我的代碼生成工具也支持這種常規的界面生成,來輔助大家做好界面的工作。
除了設置以上界面樣式外,其他生成操作一樣。得到的界面效果如下所示。
和DevExpress控件界面代碼類似,這里也使用了TableLayout的布局控件,用來較好控制布局的高度寬度,以及每行位置等,這樣整體效果就很好,也容易進行界面元素的控制。
本文轉自博客園伍華聰的博客,原文鏈接:代碼生成工具之界面快速生成,如需轉載請自行聯系原博主。