下面的代码用一个自定义 ActiveX 控件的 ShowData 方法显示 MSHFlexGrid 控件中结果集的数据。代码基于 rdoColumns 属性中的名字建立网格,并对网格进行初始化,为数据做好准备。注意对结果集的 rdoColumns 属性进行索引的OrdinalPosition 属性的使用。
有两组代码可以用来从rdoResultset 中提取数据,一种是使用 GetClipString,另一种是使用 GetRows 方法。这有助于您对某种情况下的不同解决方案进行比较。
Public Function ShowData(Resultset As rdoResultset) As Variant Dim cl As rdoColumn Static GridSetup As Boolean Dim MaxL As Integer Dim rsl As rdoResultset Dim Rows As Variant On Error GoTo ShowDataEH Set rsl = Resultset If GridSetup Then FGrid1.Rows = 51 FGrid1.Cols = rsl.rdoColumns.Count FGrid1.Row = 0 For Each cl In rsl.rdoColumns FGrid1.Col = cl.OrdinalPosition - 1 FGrid1 = cl.Name If rsl.rdoColumns(cl.OrdinalPosition - 1).ChunkRequired Then MaxL = 1 Else MaxL = rsl.rdoColumns(cl.OrdinalPosition - 1).Size + 4 End If If MaxL > 20 Then MaxL = 20 FGrid1.ColWidth(FGrid1.Col) = TextWidth(String(MaxL, "n")) Next cl GridSetup = True End If FGrid1.Rows = 1 '
清除数据的Grid
(除了标题)FGrid1.Rows = 51
FGrid1.Row = 1
FGrid1.Col = 0
FGrid1.RowSel = FGrid1.Rows - 1
FGrid1.ColSel = FGrid1.Cols - 1
FGrid1.Clip = rsl.GetClipString(50, , , "-")
ExitShowData:
FGrid1.RowSel = 1
FGrid1.ColSel = 0
Exit Function
ShowDataEH:
Select Case Err
Case 40022:
FGrid1.Clear
Resume ExitShowData
Case 13
FGrid1.Text = "< >"
Resume Next
Case Else
MsgBox "Could not display data: " & Err & vbCrLf & Error$
Resume ' ExitShowData
End Select
End Function
下面的代码实现了从某个 RDO 控件改写的自定义 ActiveX 控件的 ShowData 方法。注意,RDO GetClipString 方法在 ADO 中是由 GetString 方法所替代的。因为这以后您必须对结果 Variant 数组进行语法分析,所以例程明显变慢。如果您在使用 GetRows 函数时有问题,就应该转而使用一个更保守的(而且更慢的)解决方案,该方案在各行之间循环。然而,如果可能的话,您应该避免使用该技术,因为它同使用 GetRows 或直接绑定到某个控件相比,效率是非常低的。
注意 OrdinalPosition 属性是如何不能被用作 Fields 集合上的索引来拉出标题列的,而在 RDO 中,您是可以这样做的。要处理这种情况,可替换为一个新的整数计数器,以对所操作的列进行寻址。用 DefinedSize 和 ActualSize 属性找到不适合在列中的 TEXT 和 IMAGE 数据类型字段。这些新的属性使决定特定字段值的细节变得更容易。同时添加进去的是处理 BLOB 类型的代码(如果您在处理数据列时遇到这些类型的话)。
Public Function ShowData(Resultset As Recordset) As Variant Dim cl As Field Static GridSetup As Boolean Dim MaxL As Integer Dim Op As Integer Dim rsl As Recordset Dim rows As Variant On Error GoTo ShowDataEH Set rsl = Resultset If GridSetup Then Else FGrid1.rows = 51 FGrid1.Cols = rsl.Fields.Count FGrid1.Row = 0 Op = 0 For Each cl In rsl.Fields FGrid1.Col = Op FGrid1 = cl.Name If rsl.Fields(Op).DefinedSize > 255 Then MaxL = 1 Else MaxL = rsl.Fields(Op).ActualSize + 4 End If If MaxL > 20 Then MaxL = 20 FGrid1.ColWidth(FGrid1.Col) = TextWidth(String(MaxL, "n")) Op = Op + 1 Next cl GridSetup = True End If FGrid1.rows = 1 FGrid1.rows = 51 FGrid1.Row = 1 FGrid1.Col = 0 FGrid1.RowSel = FGrid1.rows - 1 FGrid1.ColSel = FGrid1.Cols - 1 With FGrid1 '
您也可以在这里使用ADO2 GetString
方法来替代'
下面的语句。FGrid1.Clip = rsl.GetString(adClipString, 50, , , "-")
End With
ExitShowData:
FGrid1.RowSel = 1
FGrid1.ColSel = 0
Exit Function
ShowDataEH:
Select Case Err
Case 40022, 3021:
FGrid1.Clear
Resume ExitShowData
Case 13, Is < 0
rows(j, i) = "< >"
Resume 'Next
Case Else
MsgBox "Could not display data: " & Err & vbCrLf & Error$
Resume ' ExitShowData
End Select
End Function