使用Bookmarks和SelBookmarks跟蹤記錄
Bookmarks和SelBookmarks提供了標記記錄的一種手段。當編寫應用程序中的特定功能(諸如允許最終用戶手工地選擇多個不相鄰的記錄,進行所選記錄的大批更新)時,這就很有必要。在這些情形中,需要標記哪些記錄已被選擇,因此可以使用SelBookmarks集合及其屬性。
有兩個函數,分別是CellText和CellValue方法,需要標記才能正確執行。
標記用戶的選擇
SelBookmarks集合包含所有選定的記錄的書簽。當最終用戶手工選擇記錄時(即在單擊時按住CTRL鍵),每一個選定的記錄的書簽都會加入到該集合中。使用標准的循環,用戶可以知道已經選定了什麼,也可以保存書簽(因為可能需要恢復某個值),以及執行操作:
DimiasInteger'計數器
DimintCountAsInteger
intCount=DataGrid1.SelBookmarks.Count-1
ReDimarrSelBK(intCount)'聲明用於保存書簽的數組。
Fori=0TointCount
ArrSelBK(i)=DataGrid1.SelBookmarks(i)
'在此處執行操作。如果該操作必須被
'取消,則退出該循環,然後使用該數
'組來取消這些更改。
Nexti
通過在程序中添加到SelBookmarks集合來選擇記錄
通過將記錄添加到這個集合,也可以在程序中選定記錄。例如,可能有一個顯示指定的客戶所有訂貨的網格。如果要高亮顯示該客戶花費超過$100的所有記錄,則對記錄進行過濾,並將結果書簽添加到SelBookmarks集合。
DimrsAsRecordset
Setrs=Adodc1.Recordset
WhileNotrs.EOF
Ifrs!SupplierID=12Then
DataGrid1.SelBookmarks.Addrs.Bookmark
EndIf
rs.MoveNext
Wend
顯示計算結果字段
假設在表中有一個名為"Price"的字段,並且想使用本地稅率來計算表中每一項的稅費。這就是一個計算結果字段,可以通過修改DataSource的查詢來計算這個值,並把這個值返回給DataGrid控件。
要在DataGrid控件中創建一個計算結果字段
1.確認在機器上已為Northwind數據庫建立了一個OLEDB數據源;如果還沒有創建這樣的一個數據源,請按照“創建Northwind的OLEDBData連接”的步驟操作。
2.在窗體上放置一個ADOData控件和一個DataGrid控件。
3.將ADOData控件的ConnectionString屬性設置為Northwind的數據源。
4.設置ADOData控件的RecordSource屬性。在“屬性”窗口中,單擊“記錄源”並輸入SelectProductName,UnitPrice,(UnitPrice*.082)AsTaxFromProducts。
5.將DataGrid控件的DataSource屬性設置為這個ADOData控件。
6.運行該工程。
與類模塊一起使用DataGrid控件
如果想要訪問以自定義格式或以ODBC驅動程序不直接支持的格式存放的數據,可以創建一個類來封裝該數據。然後可以編寫該類的自定義函數來檢索這些數據。這樣該類就變成了一種數據源,可以被任何數據使用者(如DataGrid控件)使用。
在這個類模塊的Initialize事件中,首先通過聲明一個作為New ADODB.Recordset的變量,來創建一個ADODBrecordset對象。在創建了這個recordset對象後,再添加字段,每個數據源中的每個字段都要加入。然後使用合適的數據填充這個記錄集。
注意也可以使用OLEDB示例提供者來創建一個數據源。關於OLEDB示例提供者的詳細信息,請參閱“創建帶有數據提供方的部件”。
類模塊有一個GetDataMember事件,只要當數據使用者(諸如DataGrid控件)需要數據時就產生該事件。在這個事件中,Data參數被設置為在Initialize事件中所創建的recordset對象。
如果要使用這個類模塊,應創建一個具有一個DataGrid控件的窗體。在該窗體的Load事件的代碼中,將該控件的DataSource屬性設置為這個類。
注意數據類模塊在設計時是不可用的。例如,如果使用DataGrid控件,則當用戶在“屬性”窗口中單擊“數據源”時,所有可用的數據源都會出現在一個下拉列表中。但其中不會有這個數據類模塊,它只能在代碼中設置。
使用類模塊創建一個數據源
下面的示例使用一個類模塊來創建一個簡單數據源。然後通過DataSource屬性將DataGrid控件綁定到該模塊。
要創建一個用於DataGrid的類
1.創建一個新的標准Exe工程。
2.給窗體添加一個DataGrid控件。如果DataGrid控件不在“工具箱”中,則在“工程”菜單中單擊“部件”,
再單擊“MicrosoftDataGridControl”,然後單擊“確定”。
3.在“工程”菜單中,單擊“引用”。在“引用”對話框中,單擊“MicrosoftActiveXDataObjects2.0Library”。
4.在“工程”菜單中,單擊“添加類模塊”來給工程添加一個數據類模塊。
5.在“工程資源管理器”窗口中,單擊並選定“類”圖標,並按F4鍵顯示“屬性”窗口。
6.在“屬性”窗口中,將類的名稱更改為NamesData。
7.在“屬性”窗口中,單擊“DataSourceBehavior”並將該屬性更改為vbDataSource。
8.在該類模塊的Declarations部分,創建一個ADODBRecordset變量,如下所示:
OptionExplicit
PrivateWithEventsrsNamesAsADODB.RecordSet
使用WithEvents關鍵詞來聲明該變量,使用戶可以對RecordSet對象的事件編程。
9.在該類的Initialize事件中,添加下述代碼:
PrivateSubClass_Initialize()
'將新的數據成員的名稱添加到DataMember集合
'這使其它對象可以看見這些可用的
DataMembersDataMembers.Add"Names"
SetrsNames=NewADODB.RecordSet '設置對象變量。
'創建一個具有兩個字段的recordset,並打開該recordset。
'第一個記錄具有一個整數的數據類型,第二個記錄是一個最大可
'達256個字符的字符串。CursorType被設置為OpenStatic
'——一個可更新的對一組記錄的快照。LockType被設置為
'LockOptimistic,以允許對該recordset進行更新。
WithrsNames
.Fields.Append"ID",adInteger
.Fields.Append"Name",adBSTR,255
.CursorType=adOpenStatic
.LockType=adLockOptimistic
.Open
EndWith
DimiAsInteger
Fori=1to10 '添加十條記錄。
rsNames.AddNew
rsNames!ID=i
rsNames!Name="Name"&i
rsNames.Update
Nexti
rsNames.MoveFirst'移到該記錄集的開始。
EndSub
這部分代碼首先創建recordset對象,然後給該對象添加兩個字段。代碼接著給recordset添加十條記錄。
10.在該類的GetDataMember事件中,添加下述代碼:
PrivateSubClass_GetDataMember(ByValDataMemberAsString,_
DataAsObject)
SetData=rsNames
EndSub
只要發生該事件——即當該類對象被綁定到一個數據使用者,如DataGrid控件時,代碼將返回該recordset對象。
11.在Form對象的代碼模塊中,聲明一個數據類的對象變量:
OptionExplicit
PrivatedatNamesAsNamesData'類變量
12.在Form對象的Load事件的代碼中,將DataGrid控件的DataSource設置為該類對象。
PrivateSubForm_Load()
'創建一個新的NamesData對象
SetdatNames=NewNamesData
'將這個DataGrid綁定到新的數據源datNames
SetDataGrid1.DataSource=datNames
EndSub
13.按F5鍵運行該工程。