在一个 MSHFlexGrid 控件中显示结果集

RDO

下面的代码用一个自定义 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

ADO

下面的代码实现了从某个 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