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