代碼生成工具之界面快速生成

界面開發,無論對于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">&nbsp;<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">&nbsp;<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">&nbsp;<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的布局控件,用來較好控制布局的高度寬度,以及每行位置等,這樣整體效果就很好,也容易進行界面元素的控制。

本文轉自博客園伍華聰的博客,原文鏈接:代碼生成工具之界面快速生成,如需轉載請自行聯系原博主。



本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/256087.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256087.shtml
英文地址,請注明出處:http://en.pswp.cn/news/256087.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

javascript - 封裝原生js實現ajax

1 /*2 * ajax方法3 */4 var Ajax function() {5 var that this;6 //創建異步請求對象方法7 that.createXHR function() {8 if(window.XMLHttpRequ…

QT對象樹、信號和槽機制

文章目錄一 、對象樹是什么&#xff1f;二、信號和槽的基本概念2.1 信號2.2 槽2.3 松散耦合2.4 特點三、示例總結一 、對象樹是什么&#xff1f; 對象樹是由父類和若干子類對象組成&#xff0c;而子類也可以由若干孫類。 QT中的對象樹是以QObject為起始父類來完成樹的構建的&a…

【數據結構】——歸并排序

目錄 一、代碼 二、隨筆 一、代碼 歸并排序的主要思路&#xff1a;將兩個有序的子列表歸并為一個有序的大列表 #歸并函數&#xff0c;假設li是由左右兩個有序的子列表組成,假設兩個子列表都是從小到大排好序的列表 def merge(li,low,mid,high)::param li: 由左右兩個有序的子列…

開發發布npm module包

開發發布npm module包 問題 在項目開發過程中&#xff0c;每當進入一個新的業務項目&#xff0c;從零開始搭建一套前端項目結構是一件讓人頭疼的事情&#xff0c;就要重新復制一個上一個項目的前端框架和組件代碼庫。其中很多功能的模塊組件都要重復拷貝&#xff0c;可以統一將…

如何使用ATS提高應用的安全性

App Transport Security&#xff0c;簡短的說就是ATS&#xff0c;是iOS9和OS X El Capitan的一個新特性。App Transport Security 的目標是提高Apple 操作系統的安全性以及在此操作系統上運行的任何應用的安全性。 基于HTTP傳輸數據的網絡請求都是明文。開啟App Transport Secu…

手機客戶端測試考慮的點

手機客戶端測試考慮點總結 版權聲明&#xff1a;本文為博主原創文章&#xff0c;未經博主允許不得轉載。 此文未本人工作中的總結&#xff0c;特此總結。 異常場景&#xff1a; 網絡異常&#xff0c;服務器異常&#xff0c;接口異常或參考參數篡改&#xff0c;斷電&#xff0c;…

NMS(非極大值抑制)算法詳解與示例

一、NMS是什么&#xff1f; NMS&#xff08;non maximum suppression&#xff09;即非極大值抑制&#xff0c;廣泛應用于傳統的特征提取和深度學習的目標檢測算法中。 NMS原理是通過篩選出局部極大值得到最優解。 在2維邊緣提取中體現在提取邊緣輪廓后將一些梯度方向變化率較小…

【數據結構】——冒泡排序、插入排序、選擇排序

# 冒泡排序&#xff0c;復雜度為O(n^2) def bubble_sorted(li:list)->list:for i in range(len(li)):# 第幾趟exchanged False# 這個是為了防止多余的遍歷&#xff0c;如果前面的元素已經是排序好的&#xff0c;那就不需要再進行比較了&#xff0c;減少運行時間for j in ra…

【轉載】ASP.NET應用程序與頁面生命周期

在本文中&#xff0c;我們將了解不同的事件&#xff0c;ASP.NET 應用程序的生命周期以瀏覽器向 Web 服務器&#xff08;對于 ASP.NET 應用程序&#xff0c;通常為 IIS&#xff09;發送請求為起點&#xff0c;直至將請求結果返回至瀏覽器結束。在這個過程中&#xff0c;首先我們…

基于PCL的ICP及其變種算法實現

文章目錄前言一、ICP算法基礎1.1 提取待匹配點對1.2 計算旋轉平移矩陣1.3 計算變換后的點和目標點之間的偏差二、ICP算法變種2.1 PLICP2.2 PointToPlane ICP2.3 NICP2.4 LM_ICP三、程序示例1. 傳統方法2. PointToPlane ICP總結前言 ICP&#xff08;Iterative Closest Point&am…

python 計算器

--coding:utf-8-- from Tkinter import * 創建橫條型框架 def frame(root, side): w Frame(root) w.pack(side side, expand YES, fill BOTH) return w 創建按鈕 def button(root, side, text, command None): w Button(root, text text, command command) w.pack(side…

最長公共子序列(LCS)

注意最長公共子串&#xff08;Longest CommonSubstring&#xff09;和最長公共子序列&#xff08;LongestCommon Subsequence, LCS&#xff09;的區別&#xff1a;子串&#xff08;Substring&#xff09;是串的一個連續的部分&#xff0c;子序列&#xff08;Subsequence&#x…

【數據結構】——排序算法系列總結

目錄 1、空間復雜度 2、穩定性 3、運行時間 4、目前默認的sort內置函數排序函數 5、六種常用排序方法 1、空間復雜度 空間復雜度產生的原因有兩個&#xff1a;①重新定義了一塊空間用于存儲數據&#xff1b;②遞歸產生了棧空間 冒泡排序、選擇排序、堆排序和插入排序屬于…

Spring Boot實踐教程(二):SpringApplication分析

2019獨角獸企業重金招聘Python工程師標準>>> 本文會通過分析上一篇中跑起來的示例程序來分析一下Spring Boot程序運行的基本原理。 概要 在上一篇的介紹中&#xff0c;程序是通過SpringBoot1HelloworldApplication.main()方法運行起來的&#xff1a; public static …

基于PCL的MLS(移動最小二乘)算法簡介與示例

一、MLS基礎 mls算法本質上和最小二乘一樣&#xff0c;是一種擬合數據的算法。區別在于mls是局部的&#xff0c;即通過系數向量和基函數分別對數據中不同位置的節點區域進行擬合&#xff0c;需要計算出全部節點域的擬合函數的參數。而傳統的最小二乘是全局的&#xff0c;采用所…

二分法php

二分法。分別使用while循環的方法和遞歸調用的方法。 <?php// 二分法的使用數組必須是有序的&#xff0c;或升序&#xff0c;或降序 $arr array(1, 3, 5, 7, 9, 13 );// 遞歸調用&#xff08;相比較好理解 function bsearch_r($v, $arr, $low, $high){if ($low > $high…

【JZOJ4861】【NOIP2016提高A組集訓第7場11.4】推冰塊

題目描述 Dpstr最近迷上了推冰塊。冰地是一個n行m列的網格區域&#xff0c;第i行第j列的格子記為(i,j)&#xff0c;也就是左上角為(1,1)&#xff0c;右下角為(n,m)。每個格子可能是冰面、障礙物、減速帶三者之一。其中&#xff0c;冰地外圍&#xff08;即第0行、第n1行、第0列、…

【圖像處理面試題】——1

鏈接&#xff1a;https://www.jianshu.com/p/e58ca1775700 1、給定0-1矩陣&#xff0c;求連通域。2、寫一個函數&#xff0c;求灰度圖的直方圖。3、寫一個均值濾波&#xff08;中值濾波&#xff09;。4、寫出高斯算子&#xff0c;Sobel算子&#xff0c;拉普拉斯算子等&#xff…

IT運維服務管理問題總結 #F#

1.管理現狀問題&#xff1a;支撐企業業務運行的IT系統主要由大量的網絡設備、主機系統和應用系統組成&#xff0c;這些設備和系統從應用角度來分又屬于不同的業務系統和部門&#xff0c;網絡設備、主機系統等具備獨立的用戶管理、認證授權和審計系統&#xff0c;且由不同的系統…

基于PCL的RANSAC(隨機采樣一致)算法簡介與示例

前言 RANSAC&#xff08;Random sample consensus&#xff0c;隨機采樣一致&#xff09;是3D點云擬合的一種重要的手段&#xff0c;可以對直線、圓、平面&#xff0c;圓球、圓柱等形狀的點云進行擬合&#xff0c;其優點在于可以最大程度上減少噪聲點對擬合效果的影響。 一、RA…