vsFlexGrid是ComponentOne公司的一個ActiveX控件,它與MS的MSHFlexGrid控件在功能上是兼容的,即MSHFlexGrid所具備的屬性和方法,它也都具備,只有少數幾個屬性名稱略有不同,使用MSHFlexGrid編寫的程序,只需要作較小的調整就可以轉換過來;但相比MSHFlexGrid,vsFlexGrid多了很多功能,它的屬性和事件非常豐富,可以實現非常靈活的控制和快捷的編碼,下面主要對一些常用和實用的功能進行介紹:
一、數據批量操作
l 利用Cell屬性批量存取數據
比如要清除一塊區域的文本,或者設置一塊區域的字體,不用循環處理,只需要一條語句就可以完成,如:
vsFlexGrid.Cell(flexcpText,1,1,5,5) = “” ‘設置(1,1)-(5,5)這塊單元格區域的文本都為空
vsFlexGrid.Cell(flexcpFontBold,1,1,5,5)=True ‘設置(1,1)-(5,5)這塊單元格區域的字體都為粗體
類似還可以設置的有單元格對齊、圖片、顏色等。
而語句:strText = vsFlexGrid.Cell(flexcpText,1,1,5,5)
返回一個用vbTab間隔列,vbCr間隔行的字符串,當然也可以反過來賦值,這樣該區域內的每個單元格都可以賦不同的值。
l 使用-1對所有行列進行處理
RowHeight(-1)=300 ‘將所有行的高度設置為300Twip,可以類似使用的屬性有:
RowHidden,ColWidth,ColHidden,ColAlignment等
二、大量數據存放
vsFlexGrid可以存放數據的地方有:CellText,CellData,ColData,RowData
除了CellText是String類型外,其他都是Variant類型,也就是說你可以將任意類型的數據存放在表格中,比如日期(Date),類型變量(Type),集合(Collection),數組,記錄集(RecordSet),以及各種對象(Object),這對於關聯數據比較多的程序非常有用。
注意:vsFlexGrid.Cell(flexcpText,1,1) = rsData!Name實際是存放了一個ADO.Field對象,應該使用CStr(rsData!Name)對類型進行明確。
三、編輯特性
vsFlexGrid的單元格是可以編輯的,並且有以下幾種編輯形式:
l 文本框:只要Editable設置為可編輯,每個單元格缺省就是TextBox編輯樣式
l 下拉框:
設置當前單元格的ComboList屬性或者指定列的ColComboList屬性,即可實現VB.ComboBox樣式的單元編輯,而且下拉界面中可以顯示多列,如:
vsFlexGrid.ComboList = _
“|#100*1;張三” & vbTab & “男” & vbTab & “28歲” & _
“|#101;李四” & vbTab & “男” & vbTab & “29歲” & _
“|#102;王五” & vbTab & “男” & vbTab & “30歲”
其中”|”間隔的是各行數據,vbTab間隔的是各列數據;第1個”|”表示下拉框可以輸入,”#”后面的是每行的ItemData, 第一個ItemData后面”*1”表示是第1列的數據在選擇后顯示在ComboBox中。
l 復選框:
設置指定列的ColDataType = flexDTBoolean,或者指定當前元單格的CellChecked屬性即可。
l 選擇按鈕:
設置當前單元格的ComboList屬性或者指定列的ColComboList屬性為”…”即可,主要配合CellButtonClick事件使用。
四、界面特性
1) 邊框
除了表格線之外,vsFlexGrid還可以類似Excel一樣,設置單元格式的邊框線條,包括顏色、粗細,有無:
VSFlexGrid.CellBorder Color As OLE_COLOR, Left As Integer, Top As Integer, Right As Integer, Bottom As Integer, Vertical As Integer, Horizontal As Integer
2) 自動行高,列寬
使用AutoSize方法,可以使列寬、或者行高根據單元格的內容進行自適應調整。
其中列寬也可以通過雙擊表頭進行自適應調整。
3) 樹形縮進(TreeList)
通過設置表格行的IsSubtotal、RowOutlineLevel屬性,可以實現樹形風格的縮進層次樣式,這樣vsFlexGrid就可以實現TreeView和ListView的結合。
4) 自繪
通過設置OwnerDraw屬性,可對實現對單元格內容的自繪處理,主要結合DrawCell事件進行:
DrawCell(ByVal hDC As Long, ByVal Row As Long, ByVal col As Long, ByVal left As Long, ByVal top As Long, ByVal right As Long, ByVal bottom As Long, done As Boolean)
5) 背景
可以為vsFlexGrid設置背景圖,背景圖相對單元格式內容是透明的,並且可以設置對齊和平鋪屬性。
6) 列排序,行、列拖動
設置vsFlexGrid.ExplorerBar屬性,就可以實現類似Windows的資源管理器一樣,點擊列頭進行列數據排序,或者用鼠標拖動改變列、行的順序。
7) 凍結行列
除了固定行列頭外,還可以類似Excel一樣,通過vsFlexGrid.FrozenCols/FrozenRows設置凍結行列,凍結行列在滾動時,和固定行列是一樣的效果,但是光標可以進入到凍結行列范圍內的單元格中去。
五、豐富的事件控制:
vsFlexGrid一共有50多個事件,這些事件主要用於編輯和界面控制,在使用過程中,經常可能會發現某個事件特別有用;因此充分利用這些事件,可以很方便地實現很多功能,下面是它支持的事件及對應列表,粗體是較常用的,從定義基本就可以看出它的作用;詳細的事件說明,可以查看幫助。
l AfterCollapse(ByVal Row As Long, ByVal State As Integer)
l AfterDataRefresh()
l AfterEdit(ByVal Row As Long, ByVal Col As Long)
l AfterMoveColumn(ByVal Col As Long, Position As Long)
l AfterMoveRow(ByVal Row As Long, Position As Long)
l AfterRowColChange(ByVal OldRow As Long, ByVal OldCol As Long, ByVal NewRow As Long, ByVal NewCol As Long)
l AfterScroll(ByVal OldTopRow As Long, ByVal OldLeftCol As Long, ByVal NewTopRow As Long, ByVal NewLeftCol As Long)
l AfterSelChange(ByVal OldRowSel As Long, ByVal OldColSel As Long, ByVal NewRowSel As Long, ByVal NewColSel As Long)
l AfterSort(ByVal Col As Long, Order As Integer)
l AfterUserFreeze()
l AfterUserResize(ByVal Row As Long, ByVal Col As Long)
l BeforeCollapse(ByVal Row As Long, ByVal State As Integer, Cancel As Boolean)
l BeforeDataRefresh(Cancel As Boolean)
l BeforeEdit(ByVal Row As Long, ByVal Col As Long, Cancel As Boolean)
l BeforeMouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single, Cancel As Boolean)
l BeforeMoveColumn(ByVal Col As Long, Position As Long)
l BeforeMoveRow(ByVal Row As Long, Position As Long)
l BeforePageBreak(ByVal Row As Long, BreakOK As Boolean)
l BeforeRowColChange(ByVal OldRow As Long, ByVal OldCol As Long, ByVal NewRow As Long, ByVal NewCol As Long, Cancel As Boolean)
l BeforeScroll(ByVal OldTopRow As Long, ByVal OldLeftCol As Long, ByVal NewTopRow As Long, ByVal NewLeftCol As Long, Cancel As Boolean)
l BeforeScrollTip(ByVal Row As Long)
l BeforeSelChange(ByVal OldRowSel As Long, ByVal OldColSel As Long, ByVal NewRowSel As Long, ByVal NewColSel As Long, Cancel As Boolean)
l BeforeSort(ByVal Col As Long, Order As Integer)
l BeforeUserResize(ByVal Row As Long, ByVal Col As Long, Cancel As Boolean)
l CellButtonClick(ByVal Row As Long, ByVal Col As Long)
l CellChanged(ByVal Row As Long, ByVal Col As Long)
l ChangeEdit()
l Click()
l ComboCloseUp(ByVal Row As Long, ByVal Col As Long, FinishEdit As Boolean)
l ComboDropDown(ByVal Row As Long, ByVal Col As Long)
l Compare(ByVal Row1 As Long, ByVal Row2 As Long, Cmp As Integer)
l DblClick()
l DragDrop(Source As Control, X As Single, Y As Single)
l DragOver(Source As Control, X As Single, Y As Single, State As Integer)
l DrawCell(ByVal hDC As Long, ByVal Row As Long, ByVal Col As Long, ByVal Left As Long, ByVal Top As Long, ByVal Right As Long, ByVal Bottom As Long, Done As Boolean)
l EndAutoSearch()
l EnterCell()
l Error(ByVal ErrorCode As Long, ShowMsgBox As Boolean)
l FilterData(ByVal Row As Long, ByVal Col As Long, Value As String, ByVal SavingToDB As Boolean, WantThisCol As Boolean)
l GetHeaderRow(ByVal Row As Long, HeaderRow As Long)
l GotFocus()
l KeyDown(KeyCode As Integer, Shift As Integer)
l KeyDownEdit(ByVal Row As Long, ByVal Col As Long, KeyCode As Integer, ByVal Shift As Integer)
l KeyPress(KeyAscii As Integer)
l KeyPressEdit(ByVal Row As Long, ByVal Col As Long, KeyAscii As Integer)
l KeyUp(KeyCode As Integer, Shift As Integer)
l KeyUpEdit(ByVal Row As Long, ByVal Col As Long, KeyCode As Integer, ByVal Shift As Integer)
l LeaveCell()
l LostFocus()
l MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
l MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
l MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
l OLECompleteDrag(Effect As Long)
l OLEDragDrop(Data As VSFlex8Ctl.VSDataObject, Effect As Long, ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
l OLEDragOver(Data As VSFlex8Ctl.VSDataObject, Effect As Long, ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single, State As Integer)
l OLEGiveFeedback(Effect As Long, DefaultCursors As Boolean)
l OLESetCustomDataObject(CustomDataObject As Variant)
l OLESetData(Data As VSFlex8Ctl.VSDataObject, DataFormat As Integer)
l OLEStartDrag(Data As VSFlex8Ctl.VSDataObject, AllowedEffects As Long)
l RowColChange()
l SelChange()
l SetupEditStyle(ByVal Row As Long, ByVal Col As Long, ByVal IsCombo As Boolean, Style As Long, StyleEx As Long)
l SetupEditWindow(ByVal Row As Long, ByVal Col As Long, ByVal EditWindow As Long, ByVal IsCombo As Boolean)
l StartAutoSearch()
l StartEdit(ByVal Row As Long, ByVal Col As Long, Cancel As Boolean)
l StartPage(ByVal hDC As Long, ByVal Page As Long, Cancel As Boolean)
l Validate(Cancel As Boolean)
l ValidateEdit(ByVal Row As Long, ByVal Col As Long, Cancel As Boolean)
六、附加功能:
1) 屬性頁:
在vsFlexGrid的屬性頁中,可以對表格進行格式和內容設計,這樣可以省去一些代碼(這部分屬性頁處理的內容保存在窗體的frx文件中)。
2) 導入/導出:
通過LoadGrid/SaveGrid方法,可以對表格內容進行導入導出;導入導出的格式有幾種:
l 它自已的二進制格式。
l 帶一定分隔符的文本文件。
l Excel97格式(不需要安裝 Excel,速度很快,但有一些屬性不支持)。
3) 打印
通過PrintGrid方法,可以將vsFlexGrid按照當前的格式和數據進行打印輸出,但這個功能比較簡單,比如不能進行預覽,設置頁眉頁腳等。(ComponentOne的另一套控件vsView與vsFlexGrid配合可以實現強大的打印相關功能)
作為一個只有600多K大小的控件(vsFlexGrid.ocx),功能這么強大確實非常不錯,在ZLHIS中也進行了大量的使用,上面只是簡略列舉了它的部分功能,更詳細的功能可以運行它的Demo進行展示,也可以查看它的幫助文件,都比較詳盡
