標籤:des winform datagridview style blog http
1概述1.1功能簡介
Sybase公司的PowerBuilder開發工具,在以前VS工具沒有成事以前,是相當風光的.微軟都要與其合作,學習它Db方面的技術,才成就了SQLServer資料庫。PB開發工具的風光得益於它非常強大的資料視窗功能,這個技術的使用,使得開發管理類軟體,尤其是開發資料庫管理類軟體變得異常簡單,與使用VS.NET開發同一軟體相比較,其開發週期可以縮短至三分之一,只是隨著Sybase的沒落,技術更新不及時,使得PB開發工具逐漸被遺忘在時間的長河中,很少被人提及和記起.但資料視窗的強大功能,我們仍然可以在NET環境中使用
此組件就是利用資料視窗的強大功能來解決我們常用的業務情境.同時,又封裝一層,使用會更加方便.
經過整理和分析,在NET環境中使用的資料視窗中包含如下功能
1.1.1網格控制項
批量展示資料,支援多種資料載入方式,底部合計帶,多選行等實用功能.類似於如下環境中的控制項
Webform |
GridView控制項,服務端只包含資料載入 |
Winform |
DataGridView控制項 |
1.1.2列印模板
將資料直接列印,在Webform環境中,同樣不必考慮欄目對象位置,樣式等令人頭痛的問題.我們可以將複雜報表的樣式,包括欄位的位置,大小等,全部在資料視窗中設定完成,WebForm端要做的工作就是載入資料即可
1.1.3單據編輯模板
單據是提供資料編輯的地方,需要根據使用者體驗不斷調整控制項布局,大小等,如果每次調整都需要開發員介入會影響使用者需求的修改時間.使用資料視窗,我們可以在另外的設計環境中修改,修改完以後可直接交付客戶使用,而不必在VS環境中修改
1.1.4檢索模板
一般在顯示批量資料的頁面中,我們可能都會提供一些常用檢索條件,來協助使用者尋找他們最需要的資料.我們在收集檢索條件時,可能會將每個檢索控制項值取出,然後拼接成SQL語句所需的Where條件.
使用資料視窗,檢索欄目可以隨時增加和刪除,檢索值可以同一拼接.
1.2應用情境
Sybase的PowerBuilder開發工具,以開發Winform軟體為主,Webform軟體很少涉及,但這並不能說明資料視窗不可以被Webform程式使用,作為ActiveX控制項,它仍能在IE瀏覽器中使用.目前支援如下幾種應用情境
情境名稱 |
描述 |
Webform應用程式 |
作為ActiveX控制項使用 |
Winform應用程式 |
作為UserControl控制項使用 |
1.3面向群體
此控制項的製作環境可以不在VS.NET環境中,只需安裝PowerBuilder或運行資料視窗設計器即可完成資料視窗的製作過程.軟體實施人員作為程式使用者的直接服務者,經過培訓1-2天,也可以完成簡單的製作.程式的發布和布署也簡單方便.因此,除軟體開發員之外,實施員也是此控制項的面向群體
面向群體 |
描述 |
軟體開發員 |
調用控制項 |
實施員 |
製作資料視窗,供控制項調用 |
1.4運行環境
Net類庫只須2.0及其以上即可.
它本身也和一般的控制項相同,只需調用DLL檔案即可.DLL環境包含兩部分.第1部分是PowerBuilder環境所要求的,由於資料視窗控制項是PowerBuilder開發工具中的控制項,因此必須包含此部分DLL;第2部分是資料視窗本身所要求的,資料視窗本身如果需要在NET環境中使用,那麼就需要將PowerBuilder環境中的資料視窗控制項由Sybase公司封裝一層,作為NET可以解析的控制項使用,這就有了第2部分所需要的DLL檔案.詳細DLL檔案如下所示
DLL檔案類型 |
DLL檔案清單 |
PowerBuilder應用程式 |
|
DataWindow控制項 |
|
1.5安裝程式
控制項本身沒有提供Setup安裝程式,只需將運行環境和QH首碼的dll檔案一併複製至Bin檔案夾內,通過Net專案檔的Reference引入即可
1.6名詞解釋
l DataWindowControl
這是一個控制項的名稱,就是我們所封裝的這個控制項在NET環境中的名稱.在PowerBuilder開發環境中,它是叫DataWindow的名字.這個控制項可以理解為可視化操作資料視窗的控制項,類似於NET中的Panel或GroupBox這類的容器控制項.
l DataStore
這是一個對象,此對象的功能與DataWindowControl控制項相同,唯一不同的地方:它是不可視化的操作資料視窗的控制項,在NET中,它相當於DataSet或DataTable對象的作用,填充並操作資料.
l DataWindowChild
這也是一個對象,如果把DataWindowControl比做是Winform中DataGridView控制項的話,那它就是下拉式功能表欄目對象.用法完全相同,需要載入資料,設定資料列和顯示列名稱.
l DataBuffer
可理解為緩衝區,此控制項共包含3個緩衝區,如下所示.一般來說,我們只用到Primary緩衝區,而控制項本身預設的資料操作也是在Primary緩衝區中操作的
緩衝區名稱 |
描述(官方,英文) |
Primary |
The data in the primary buffer, meaning data that has not been deleted or filtered out. (Default value when argument is optional.) |
Delete |
Data in the delete buffer, meaning data that has been deleted from the DataWindow but has not been committed to the database. |
Filter |
Data in the filter buffer, meaning data that has been removed from view. |
l RowStatus
枚舉對象,即資料視窗行狀態,相當於NET中的DataRowState枚舉對象.屬性值包含如下:
枚舉對象 |
描述 |
Modified |
處於修改狀態的行 |
New |
處於新增狀態的行 |
NewAndModified |
處於新增和修改狀態的行 |
NotModified |
沒有操作的行狀態 |
l ItemStatus
枚舉對象,與RowStatus功能一致,它是欄目狀態.即資料視窗某行中的某個欄目是否被修改.NET中並沒有找到與之類似的枚舉對象.屬性值包含如下:
枚舉對象 |
描述 |
Modified |
處於修改狀態的欄目 |
NotModified |
沒有操作的欄目狀態 |
l Processing
這是一個資料視窗的屬性,此屬性工作表示控制項所載入的資料視窗是類型,控制項本身是不知道它所要載入的資料以何種方式展示,有可能是批量資料(Grid類型),有的是單條資料(Form類型),因此設定了這個屬性用於區分.屬性值包含如下:
類型 |
描述 |
Form |
單條資料展示 |
Grid |
批量資料展示,類似於網格控制項 |
Label |
標籤,類似於超市裡的商品標籤 |
Graph |
圖表,控制項也可以直接載入圖表 |
Crosstab |
交叉報表,對Db中某張表直接可以設定行列交叉 |
Composite |
複合報表.即此類型的資料視窗中可以同時放置其他類型的資料視窗,作為子表使用.如:可同時放置Grid和Form |
OLE |
可以把資料直接放至OLE控制項,OLE控制項必須是PowerBuilder支援的 |
RichText |
可以把資料直接放至RichText控制項中 |
TreeView |
這個類型的資料展示,是最近比較火的一種展示方式.即網格控制項中的父子表.簡單理解,父子表也是有層級關係的,與樹相比,每級可能需要展示不止一個結點, |
l ItemEditStyle
資料視窗中對象的編輯類型.即表示對象是文字框,直線或圖片框等.其屬性值包含如下
枚舉對象 |
描述 |
Text |
標籤,可理解為NET中的Label |
Column |
Db列對象,可理解為NET中的TextBox |
Line |
直線 |
Bitmap |
圖片框 |
Compute |
計算資料行 |
l Item
這是一個關鍵字,會更貼切一點.在封裝的類庫中,會看到很多GetItemXX和SetItemXX的方法.這裡的Item可理解為項目,子項,即資料視窗中某個對象,可能是直接,可能是文字框或圖片框
l Sub
這是一個關鍵字,只適用在複雜類型的資料視窗中.複合類型的資料視窗是可以同時放置其他資料視窗,那麼這其中的資料視窗就是用Sub來表示.這是為了與Item關鍵字有所區別,因為他們的含義有所不同
2API文檔
參考檔案Navi.Component.DataWindow.chm檔案
3業務情境
使用此控制項可以很方便的協助我們完成很多常用的業務情境,在此針對常用的業務情境,提供程式碼範例和說明注釋
3.1資料載入
就是將Db或其他外部檔案的資料填充至資料視窗控制項中,此類庫中提供6種方式實現資料載入.即有PB的傳統方式,也有基於NET的方式,使用時需要根據不同的業務情境來確定用哪種方式
在載入資料之前,我們首先要對控制項設定兩個屬性.即它所載入的資料所需要的載體檔案名稱和對象.可以理解為承載資料的可視化視窗名稱及其所在DLL檔案名稱.使用如下方式載入即可,-1所示
圖-1
l 方式一.-2所示
圖-2
說明
1. DataWindow控制項在資料載入時,也有一個事務的對象,用於串連Db的.就是Transaction對象,與NET中的Transaction對象作用相似,設定一個Db連接字串,將事務對象綁定至控制項,再重新整理一下即可
2. 此種方法目前僅支援SqlServer資料庫,而且最好在WinForm應用程式中使用.此控制項中的事務與NET的事務有所區別,它是常串連Db的,而NET的事務是使用一次串連一次,這是最大的區別.所以使用此方法對串連Db的頻寬會有影響.
3. 注意提供的Db連接字串格式,包含如下四個關鍵字(注:大小寫不區分)
關鍵字 |
描述 |
Data Source |
SqlServer服務名稱 |
Database |
資料庫名稱 |
User id |
登入使用者ID |
PWD |
登入使用者密碼 |
l 方式二.-3所示
圖-3
說明
1. 這個方式應該是Sybase為了適應NET而新增的對象,在Sybase內建的PowerBuilder開發工具中是沒有這個對象的,而且此控制項剛在NET上使用的時候,ADO.NET的Db串連方式是最流行的,所以會有此控制項
2. 與方式一中的Transaction對象使用方法完全一致,注意它的關鍵字與方式一的區別是使用了Server這個關鍵字作為伺服器名稱
3. 關鍵字說明(不區分大小寫)
關鍵字 |
描述 |
Server |
SqlServer服務名稱 |
Database |
資料庫名稱 |
User id |
登入使用者ID |
PWD |
登入使用者密碼 |
l 方式三.-4所示
圖-4
說明
1. 此種方式是純NET的方式,載入一個DataTable對象,然後直接重新整理控制項即可
l 方式四.-5所示
圖-5
說明
1. 此種方式是使用InsertRow方式增加資料,可用在載入單條資料
2. 可使用在WebForm應用程式中,在後台擷取資料,使用Ajax方式傳遞給前台,在前台通過InsertRow方式載入即可.這是因為在WebForm應用程式中,我們是以Active控制項方式使用的,在後台是不能操作控制項的
l 方式五.-6所示
圖-6
說明
1. DataWindowFullState對象可理解為位元據類型.它可以將控制項的所有結構和資料一併儲存到這個對象中,然後通過複製的方式一併傳遞給另一個對象
2. WebForm應用情境中也可以使用此方法
l 方式六.-7所示
圖-7
說明
1. 控制項本身有2個方法,專門用來過濾資料,即SetFilter和Filter.
2. 使用此方法,首先將所有資料載入至此,然後就可以使用此方法,設定查詢條件檢索資料,如果條件為空白,則檢索出所有資料
3.2欄目值收集/填充
欄目的取值,我們一般只需擷取兩種欄目類型的值就可以了.分別是Column和Compute.類庫中也提供了若干方法支援欄目的取值和賦值操作.
方法類型 |
方法名稱 |
描述 |
取值 |
GetItemDeciaml |
擷取欄目類型為Decimal類型的欄目值 |
GetItemDouble |
擷取欄目類型為Double類型的欄目值 |
GetItemDateTime |
擷取欄目類型為DateTime類型的欄目值 |
GetItemString |
擷取欄目類型為String類型的欄目值 |
GetItemObject |
擷取欄目值,不區分欄目類型 |
GetItemObjectText |
擷取欄目顯示值,下拉式功能表編輯類型欄目專用 |
GetItemExpression |
擷取計算欄位運算式,計算欄位專用 |
賦值 |
SetItemNull |
設定欄目值為Null |
SetItemObject |
設定欄目值,Object類型 |
SetItemExpression |
設定欄目運算式,只對計算欄位 |
3.3單據頁面級聯操作
所謂級聯操作,就是某個控制項值會根據另外一個控制項值的變化而變化,一般最常見的常景要屬省市區的聯動效果.現使用此控制項類比此業務情境,情境如下描述
兩個欄目,分別是省和市,均為下拉式功能表編輯類型.其中,省填充北京市和天津市;市中的資料根據北京市或天津市,載入下面的區縣.如:北京市,東四區;天津市,紅橋區.介面-8所示.選擇省部分的下拉式功能表,市的資料會跟著聯動
圖-8
3.4複合報表示例
複合報表,一般用於製作複雜結構的資料視窗,例訂列印票據,需要表頭資料,詳細資料和表尾資料.也就是說,需要由3部分組成.普通的資料視窗是沒有此功能的,要麼都是表頭的Form資料視窗,要麼都是詳細資料的Grid資料視窗.而複合資料視窗就可以解決此問題,而且也可以通過可視化設計實現.在-22所示的頁面中,選擇需要的子資料視窗即可.
圖-22
這裡我們選擇如下3個資料視窗,作為複合資料視窗的表頭,表體和表尾.
名稱 |
描述 |
d_example_composite_head_bl |
複合資料視窗表標頭檔 |
d_example_composite_body_bl |
複合資料視窗表體檔案 |
d_example_composite_foot_bl |
複合資料視窗表尾檔案 |
載入資料方式也比較簡單,-23所示,如同載入下拉式功能表的資料相同,-23所示
圖-23
看下最圖的,-24所示
圖-24
3.5動態建立對象
所謂動態建立對象,就是根據某個控制項中的資料視窗,在另外的模板檔案中動態建立對象.這個業務情境適用於複合資料視窗列印,由於複合資料視窗是由多個子資料視窗組合而成,因此列印也只能列印其中一個,如果全部列印的話,就需要將每個子資料視窗的對象動態產生至一個列印資料視窗才可以.
可動成產生的對象即是ItemEditStyle的樣式,這幾種編輯類型的對象均是可以動態產生的.調用方法名稱-18所示.只需傳入對象名稱即可,也可以同時擷取多個對象,也可以擷取某一編輯類型的所有對象產生語句
圖-18
建立的方式很簡單,我們只需調用Modify方法即可.一般這個方法與Describe方法一併使用,主要處理資料視窗中的對象屬性值的取值和賦值.在提供的樣本頁面中,-19所示.對每個編輯類型的對象,產生的Create語句都有所描述
圖-19
3.6交叉表資料展示
交叉表的使用,可以協助我們快速分析資料,但由普通的二維錶轉為複雜的交叉表,需要有一定功力的開發員才可以.此控制項可以以嚮導的方式可視化地將一個普通的二維錶轉為交叉表的形式.類比表結構-9所示.類比學生的學科成績
圖-9
我們來看看製作嚮導,這就用到PowerBuilder的開發工具了.建立的資料視窗類別型選擇CrossTab類型之後,在-10選擇行列關係時,這樣選擇就可以了.
圖-10
只要定義好所需要的行列欄目名稱,以及交叉後需要顯示的值就可以了,設計-11所示
圖-11
最後,我們要做的事情,就是填充資料,填充的資料是普通的二維表資料,不必是交叉後的表資料.填充資料的方式要說明下:採用PB的傳統方式載入,不是通過DataTable對象載入就可以了.-12所示
圖-12
看,就是這樣簡單.整個流程最複雜的設計環節交由可視化的設計器實現,我們只需寫代碼載入資料即可.最終-13所示
圖-13
3.7父子表資料展示
父子表的功能,關鍵是看網格控制項是否支援,值得慶幸的是,此控制項我們可以類比出父子表的效果,我們採用的思路是TreeView類型的資料視窗,這個類型的資料是在PB10以後才增加的內容,使用效果也不錯.父子表簡單說就是樹的一種擴充,樹裡面是只顯示某一個欄目值,而父子表在同一層級中要求同時顯示多個欄目值,此類型的資料視窗就實現了同時展示多個欄目.製作過程如下.
步驟1:準備做為父子表的資料來源,這裡採用Northwind資料庫中的Orders和Order Details表,表結構定義-14所示
圖-14
步驟2:製作資料視窗,在選擇TreeView類型的資料視窗後,選擇資料來源,在-15所示的頁面中,右側的欄目名稱列表就是我們作為父級資料的欄目名稱,這裡選擇OrderID,CustomerID,EmployeeID和OrderDate四個欄位即可.OK,整個過程製作完成,我們看看設計時的,需要美觀的話,可以再載入一下,-16所示
圖-15
圖-16
步驟3:載入資料,使用PB的傳統方式或NET方式均可.最終效果-17所示
圖-17
3.8圖表示例
資料視窗也是支援圖表功能的,而且也十分強大,圖表類型支援很多種,包含如表類型.-20所示
圖-20
製作流程與製作一般資料視窗一致,在-21的頁面中選擇好XY座標所需要的值即可,產生的最終-22所示
圖-21
圖-22
4開發樣本說明
本控制項提供的樣本解決方案,其開發環境:VS2012+Net.4.0
樣本解決方案說明
名稱 |
描述 |
Navi.Example.DataWindow |
整個解決方案名稱 |
Navi.Example.DataWindow.WinForm |
WinForm和WebMVC類型樣本檔案 |
Navi.Example.DataWindow.WebHtml |
WebForm類型樣本檔案 |
個人版
http://pan.baidu.com/s/1pJqduEv
5FAQ
1. 控制項可以在什麼開發環境下使用?
答:控制項可以在WebForm和WinForm均可以使用.在WinForm控制項中,作為自訂控制項使用;在WebForm控制項中作為ActiveX控制項使用,並且只可以在以IE為核心的瀏覽器中使用.
2. 控制項是基於PowerBuilder開發工具什麼版本?
答:控制項是基於PowerBuild11.5的版本
3. 批量資料視窗中的資料行號是從0還是1開始?
答:是從1開始.與NET的起使有所區別,這是因為Sybase的PowerBuilder開發工具要早於NET出現