对 Hierarchical FlexGrid 中的数据进行合并与排序

在本节的应用方案介绍了如何对 Hierarchical FlexGrid 中的数据进行排序和合并。在大多数情况下,可以通过将数据库下载到 Hierarchical FlexGrid 的方式来访问数据。不过,在这里示例数据通过“Code Editor”窗口填写到 Hierarchical FlexGrid 的行与列中。

建立数据显示

  1. 设置 Hierarchical FlexGrid 的各种属性。

  2. 建立数据。

  3. 定义各种子程序,以计算索引值和进行排序。

  4. 定义子程序,将数据(来自第二步)填入 Hierarchical FlexGrid。

  5. 允许控件切换到数据组织视图。

要完成本方案,请依次执行本节中的各个步骤。

设置控件的各种属性

使用下表中的设置值,设置列数与行数、字体信息,并为 Hierarchical FlexGrid 创建列标头。

MSHFlexGrid 控件

属性设置值

NameFg1

Cols4

Rows20

MergeCells2 – Restrict Rows

FormatString<Region |<Product |<Employees |>Sales

FontNameArial

数据的排序与合并

使用下面的过程完成 Hierarchical FlexGrid 中的数据排序与合并。

排序与合并数据

创建一个数组用来存储数据。为此,首先在“Code Editor”窗口的 Form_Load 事件中加入下面的子程序:

Sub Form_Load ()
   Dim I As Integer
   '创建数组。
   For i = Fg1.FixedRows To Fg1.Rows - 1
      '地区。
      Fg1.TextArray(fgi(i, 0)) = RandomString(0)
      '产品。
      Fg1.TextArray(fgi(i, 1)) = RandomString(1)
      '雇员。
      Fg1.TextArray(fgi(i, 2)) = RandomString(2)
      Fg1.TextArray(fgi(i, 3)) = _
      Format(Rnd * 10000, "#.00")
   Next

   '设置合并。
   Fg1.MergeCol(0) = True
   Fg1.MergeCol(1) = True
   Fg1.MergeCol(2) = True

   '排序以查看效果。
   DoSort
' Format Grid
Fg1.ColWidth(0) = 1000
Fg1.ColWidth(1) = 1000
Fg1.ColWidth(2) = 1000
Fg1.ColWidth(3) = 1000

End Sub

  1. 计算一个索引并完成排序。要这样做,请定义一个例程来计算索引并排序。该索引时同 TextArray 属性一起使用来对数据排序。插入下列例程计算索引:
Function Fgi (r As Integer, c As Integer) As Integer
   Fgi = c + Fg1.Cols * r
End Function

Sub DoSort ()
   Fg1.Col = 0
   Fg1.ColSel = Fg1.Cols - 1
   Fg1.Sort = 1   '一般为升序。
End Sub
  1. 将数据输入到您的 Hierarchical FlexGrid。要这样做,请定义一个例程使用示例数据充填 Hierarchical FlexGrid:
Function RandomString (kind As Integer)
   Dim s As String
   Select Case kind

      Case 0   '地区。
         Select Case (Rnd * 1000) Mod 5
            Case 0: s = "1. Northwest"
            Case 1: s = "2. Southwest"
            Case 2: s = "3. Midwest"
            Case 3: s = "4. East"
            Case Else: s = "5. Overseas"
         End Select

      Case 1   '产品。
         Select Case (Rnd * 1000) Mod 5
Case 0: s = "1. Chai"
Case 1: s = "2. Peppermint"
Case 2: s = "3. Chamomile"
Case Else: s = "4. Oolong"
         End Select

      Case 2   '雇员。
         Select Case (Rnd * 1000) Mod 4
Case 0: s = "Clare"
Case 1: s = "Tiffany"
Case 2: s = "Sally"
Case Else: s = "Lori"
         End Select
   End Select
   RandomString = s
End Function

如果在此时运行工程,则将显示窗体如下:

接着,您需要允许用户重新组织数据。也就是说,您必须允许 Hierarchical FlexGrid 切换数据组织视图。

  1. 通过添加下列例程重新组织数据,该例程将列拖动到新的位置。当用户按下鼠标按钮来触发 MouseDown 事件时,该例程用 Tag 属性保存列数目:
Sub Fg1_MouseDown (Button As Integer, _
Shift As Integer, X As Single, Y As Single)
   Fg1.Tag = ""
   If Fg1.MouseRow <> 0 Then Exit Sub
   Fg1.Tag = Str(Fg1.MouseCol)
   MousePointer = vbSizeWE
End Sub
  1. 添加下列例程以重新调整,当用户释放鼠标按钮触发 MouseUp 事件时,该例程重新调整列并将数据排序:
Sub Fg1_MouseUp (Button As Integer, Shift As _
Integer, X As Single, Y As Single)
   MousePointer = vbDefault
   If Fg1.Tag = "" Then Exit Sub
   Fg1.Redraw = False
   Fg1.ColPosition(Val(Fg1.Tag)) = Fg1.MouseCol
   DoSort
   Fg1.Redraw = True
End Sub

一旦完成了该方案中的过程,则当您在运行时无论合适将列拖动到新位置时,数据都重新组织。例如,如果您将 Employee 列拖动到左边,它将会以如下方式出现: