日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C/S简易UI框架开发总结(2)

發布時間:2023/12/18 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。