C/S简易UI框架开发总结(2)
?????? 看了很多的回復,謝謝大家的關注!
?????? 今天我想寫個例子,簡單說下如何使用這個框架開始新的項目并實現一個典型的CRUD功能。期間我還想說說關于各種UI組件間信息交互和調度方面的問題。這個組件一直在修修補補,基本穩定后也沒有真正的仔細考慮過是否有更好的實現方式,通過簡單的說明希望能把我的思路也理理清楚。大家也多多拍磚。
開始一個新的項目,首先要做的是創建一個主窗體,它直接從WorkbenchBase繼承即可。
Partial Class MainForm
Inherits Component.WorkbenchBase
…………….
End Class
????? 完成上面代碼后,就可以得到下圖這樣一個具備基本的菜單、手風琴和用戶組件區的窗體。
由于業務功能沒有具體實現,所以手風琴菜單什么都沒有。而主菜單中除了與業務動作緊密關聯的“編輯”菜單外,其他菜單項WorkbenchBase以默認提供。
主窗體有了以后,我們可以在實現一個典型的CRUD功能。
上一篇中以提到,實體編輯組件(EntityControl)用于處理一個業務實體的用戶交互界面,一次做CRUD功能首先要創建一個自定義控件,然后修改代碼,讓他繼承自EntityControl。
?
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Public Class MyEntityContorl
??? Inherits Component.EntityControl
???? …………….
End Class
而后需要把實體中的字段控件逐個定義到這個控件上,如下圖
?
需要注意的是,為了能夠完成組件與業務實體自動進行賦值和取值,要為需要進行數據交互的控件的Tag屬性填寫上相應的實體屬性名。
?
如果實體組件上有需要數據綁定的組件,比如Combobox等,則重寫InitBindableControl方法,把綁定的具體實現再在該方法內。
Public Class MyEntityContorl
??? ''' <summary>
??? ''' 實現可綁定組件的綁定方法
??? ''' </summary>
??? ''' <remarks></remarks>
??? Public Overrides Sub InitBindableControl()
??????? MyBase.InitBindableControl()
??? End Sub
End Class
實體組件通過反射調用相應的方法完成CRUD操作,默認方法名新增為“INSERT”,刪除為“DELETE”,修改為“UPDATE”。如果需要變更相應方法名可以改寫下面的屬性。
Public Overrides ReadOnly Property InsertMethodName() As String
??????? Get
??????????? Return MyBase.InsertMethodName
??????? End Get
??? End Property
?
??? Public Overrides ReadOnly Property UpdateMethodName() As String
??????? Get
??????????? Return MyBase.UpdateMethodName
??????? End Get
??? End Property
?
??? Public Overrides ReadOnly Property DeleteMethodName() As String
??????? Get
??????????? Return MyBase.DeleteMethodName
??????? End Get
? End Property
如果實體控件還需要提供額外的業務操作(如審核等),自己新增相應的方法即可。
此時的用戶編輯組件并不知道他要編輯的業務實體對象是什么,由于大部分的CRUD操作在網格組件(GridView)中發起,此類場景下GridView會自動為用戶編輯組件的DataSource賦值。在少數場景下,如果一個用戶編輯組件需要獨立使用,則需要自己編碼為用戶編輯組件設置DataSource和State(新增、修改、刪除等狀態)屬性,以便用戶編輯組件能夠知道他要處理的實體對象和處理方法。如下面的代碼:
?
??????????? entityControlHost.State = New EntityControlHostAddNewState()
??????????? entityControlHost.EntityControl.DataSource = r
到此為止一個實體編輯組件就完成了,他已經具備的與業務實體進行數據交互,CRUD的業務動作的自動調度等功能。由于重點在UI框架的介紹,具體CRUD的實現過程不再說明。
實際應用中,一個程序的界面組織形式有可能有兩種顯示方式:MDI和SDI。框架通過LayoutBehavier同時支持這兩種方式,但是有些我們遇到的系統中的某些功能只能以MDI形式展現,由此可能造成有些SDI顯示正常的組件在MDI中顯示異常,因此我們需要為每個實體編輯組件定義一個容器,這個容器一方面可以提供SDI和MDI的支持,另外可以實現命令按鈕,業務調度與實體編輯組件松耦合,避免重用的局限性。實體編輯組件的容器分為兩類:EntityTabbedHost和EntityDialogHost,分被對應MDI和SDI。其中EntityDialogHost可以在MDI和SDI中系統自動甄別使用,EntityTabbedHost只能應用在MDI中。
那么就可以為MyEntityControl定義一個容器,
?
讓這個組件集成EntityDialogHost,得到下面的窗體:
?
而后把剛才做好的實體編輯組件添加到這個窗體中。
??
并在代碼中填寫下面內容
Public Overridable Property EntityControl() As EntityControl Implements IEntityControlHost.EntityControl
??????? Get
??????????? Return MyEntityControl1
??????? End Get
??????? Set(ByVal value As EntityControl)
??????????? MyEntityControl1 = value
??????? End Set
End Property
此時,一個完整的實體編輯功能做完了。他已具備的保存、刪除等基本的命令按鈕,并實現了相應的調度功能,如果需要增加額外的業務命令,直接增加按鈕并完成相應處理代碼即可。
后面我們在做一個這個實體的網格組件,讓這個功能更完整。
貼圖太費勁了,很簡單,我就文字描述了,首先定義一個自定義組件,讓這個組件集成GridView,此時獲得下面的控件。
?
使用設計器,添加相應的列,即可完成網格組件的定義。如果實體編輯組件中有額外的業務處理(如審核等),可以把他以菜單項的形式定義在編輯或系統中,后面框架會自動與主菜單合并。以保證框架業務調度和展現的一致性。
此時該組件已具備了網格自定義(列,條件樣式等,其實這個很好做都是Janus組件的一個功能集成)及CRUD及其他業務功能的調度能力。
并且他不需要而外定義容易,因為系統會自動根據LayoutBehavier的MDI和SDI狀態決定他的展現形式。
至此CRUD的功能都做完了,剩下就是拼裝這個功能。
拼裝過程原來是參照SharpDeveploer用插件做的,包括依賴關系等,后來感覺開發規模有限,調試也很麻煩就放棄了。
簡單說下拼裝過程,首先在一個業務功能對應著一個FolderItem,多個FolderItem構成一個Folder,一個Folder對應著主窗體上左側手風琴菜單的一組。
為了把上面的業務功能增加到系統中,需要以下代碼:
Public Class CustomerFolder
??? Inherits Component.Folder
??? Public Sub New()
??????? Init()
??? End Sub
?
??? Sub Init()
?
??????? Dim item As FolderItem
??????? item = New FolderItem
??????? Text = "XXXXX管理"
??????? ImageName = Application.StartupPath + "\images\basedata.bmp"
??????? item.FolderName = "XXXXX管理"
??????? item.FolderOrder = 1
??????? item.FolderGroup = "XXXXX管理"
??????? item.IconName = "small75.bmp"
??????? item.Subject = "XXXXX管理"
??????? item.ViewFullName = "CustomerView"
??????? item.BusinessServiceFullName = "DAL.CustomerProvider"
??????? item.BusinessMethodFullName = "GetAll"
??????? AddFolderItem(item)
??? End Sub
End Class
而后在MainForm(Workbench)中重寫CreateFolders()方法
Public Overrides Function CreateFolders() As Component.FolderKeeper
??????? Dim folders As New Component.CustomerFolder
??????? Dim b As BaseFolder = New BaseFolder
??????? folders.Add(b)
??????? Return folders
End Function
其實上面的信息之前是卸載配置文件或數據庫里,那樣就代碼整潔些,但是可讀性會稍差,改成這樣也不滿意,糾結。
下面完成啟動代碼,就大功搞成了~
? ''' <remarks></remarks>
??? Public Sub Main()
??????? Application.SetCompatibleTextRenderingDefault(False)
??????? Application.EnableVisualStyles()
?
??????? Dim mainForm As New MainForm
??????? mainForm.BusinessBehavier = ?New WcfBusinessBehavier
??????? mainForm.LayoutBehavier = ?New TabbedLayoutBehavier
????? ??mainForm.ServiceManager = New Component.ServiceManager
??????? mainForm.ServiceManager.ValidateService = New ValidateService
?????? '其他服務和Bevhavier暫時不需要,不寫了?
??????? System.Windows.Forms.Application.Run(mainForm)
End Sub
當然完美的話很多工作要做,但是基本的功能都說明就可以了。運行一下吧:
?
最簡單的CRUD就這么做了,省去了很多賦值取值的麻煩,界面風格統一了,業務功能一致性有保障而且所有調度功能都不用重復寫。
還是那句話,拋磚引玉,歡迎大家用力扔玉,最好是藍田玉,呵呵。
轉載于:https://www.cnblogs.com/winscale/archive/2011/03/10/1980079.html
總結
以上是生活随笔為你收集整理的C/S简易UI框架开发总结(2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在Javascript中实现伪哈希表
- 下一篇: [Silverlight]使用Paged