四、用FlexGrid控件来操纵数据
使用FlexGrid ActiveX控件可以在Microsoft Visual Basic的窗体中创建一个电子数据表格,也可称之为网格。FlexGrid ActiveX控件可以在网格中显示任何类型的表格式数据:文本、数字、日期,甚至图形。但是下面将主要学习使用FlexGrid控件显示Microsoft Access数据库的字段和记录。
FlexGrid控件在电子数据表格中分别用行和列来显示数据库表的记录和字段。你可以在FlexGrid对象中进行许多电子数据表格的典型操作,包括选中单元、重置列宽、对齐标题和格式化文本。你可以从用文本填充简单的FlexGrid控件开始,选中文本、设置几个格式选项。接下来,你将进一步深入到把FlexGrid控件绑定到数据库上、显示数据库表、对记录进行排序、在整个数据库中搜索用户定义的字符串文本。
1、将FlexGrid用作通用电子数据表格
FlexGrid是Microsoft Visual Basic 专业版和企业版中包含的ActiveX控件。在工程中使用FlexGrid控件之前,需要在Project(工程)菜单的Components(部件)菜单项打开的对话框中选择Microsoft FlexGrid 6.0 control(即msflxgrd.ocx),把控件添加到工程中的工具箱中 。
FlexGrid控件提供了许多电子数据网格传统的组织优点。可以用它来创建货物清单、计算税款、管理帐目、跟踪零件列表和库存清单等等。另外,Microsoft将FlexGrid控件设计为一种可绑定的控件,它可以通过在同一窗体上的Data控件来显示数据库信息。如果你想用原始的表格形式迅速显示数据库信息,那么FlexGrid控件就是最好的选择。
提示:Visual Basic 6.0专业版还提供了一个被称为Hierarchical FlexGridActiveX 的同类电子表格控件(即mshflxgd.ocx)。此控件的用法与FlexGrid控件一样,并且它们有一套相同的属性、方法和事件。但是,HierarchicalFlexGrid控件必须被绑定到ActiveX Data Objects(ADO)控件上,注意ADO控件并不是Visual Basic工具箱中的内部Data控件。“Hierarchical”表示这个控件可以显示由数据库中的多个表创建的记录集。
理解行和列
由FlexGrid控件产生的电子数据网格是一种包括平行的行和垂直的列组成的表格。在缺省情况下,第一行和最左一列作为保留的行标题和列标题,并且用阴影背景色显示。你可以用属性Rows来设置表格中行的数量,用属性Cols来设置表格中列的数量。下图显示了一个带有8行5列的FlexGrid表格的窗体:

FlexGrid控件中的表格数据可以像二维数组那样操作。表格的第一维是行数,第二维是列数。例如,表格最左上角的单元可以用地址0,0(0行,0列)来引用。
向单元中添加文本
用TextMatrix属性向单元中添加文本。
当要把一个值放到FlexGrid的某一个单元中时,需要设置TextMatrix属性来指定单元的位置和一个值。表格中你可以指定任何数值或字符串数据类型的值。
例如,要把单词“Bob”放到第3行第1列的单元中,可以输入如下的程序语句:
MSFlexGrid1.TextMatrix(3,1) = "Bob"
同样,要把数字1500放到第2行第1列的单元中,可以使用如下的语法:
MSFlexGrid1.TextMatrix(2,1)= 1500
在单元中插入图形
使用CellPicture属性来添加图形。
你可以通过使用Set语句、CellPicture属性和LoadPicture函数在FlexGrid表格单元中插入图形。有效的图形类型包括图标文件(.ico)、位图文件(.bmp)和Windows的图元文件(.wmf)。
例如,下列程序语句在表格的指定单元中显示图元文件Coins.wmf:
Set MSFlexGrid1.CellPicture = LoadPicture (“c:\vb\coins.wmf”)
调整单元的高度和宽度
当你向一个单元中添加图形时,FlexGrid控件并不会自动重置单元的大小来显示它。你可以用RowHeight和ColWidth属性来调整单元的高度和宽度,给它们指定一个以Twip为计量单位的数值。
例如,下列语句把表格的第1行和第1列的高度和宽度设置为2000 Twip,括号里的数字分别指出了当前行和当前列:
MSFlexGrid1.RowHeight(1)= 2000
MSFlexGrid1.ColWidth(1)= 2000
直接把这两条语句加入到上面在CellPicture属性中显示图形的Set语句中,单元将会扩大到足以显示整个图形的尺寸。
注意:当改变表格中一个单元的大小时,实际上就改变了那个单元所在的整个行和整个列的大小。
选中单元
使用Row和Col属性选中单元。
如大多数电子数据表格一样,在格式化单元内容之前,必须要在FlexGrid控件中选中它们。在FlexGrid控件中,你可以用程序代码选中单独的单元或一组(相邻的块)的单元。
要选中单独的单元,只要简单的将Row和Col的属性设置到你想选择的行和列即可。你指定的行和列的交叉处就是你选中的单元。
例如,如果要选中表格的单元1,1,可以使用下列程序语句:
MSFlexGrid1.Row = 1
MSFlexGrid1.Col = 1
要选择一个区域的单元时,必须要指定所选区域的开始点和结束点。开始点就是你刚刚用Row和Col属性指定的单元(第1行,第1列以上),
结束点由RowSel和ColSel属性确定。
例如,下列程序语句在控件FlexGrid中选择了相邻的8个单元(从单元2,2到单元5,3):
MSFlexGrid1.Row = 2 MSFlexGrid1.Col = 2 MSFlexGrid1.RowSel = 5 MSFlexGrid1.ColSel = 3

格式化单元
如果打算格式化一组单元,则只需在选中单元之后加入下列程序语句:
MSFlexGrid1.FillStyle = flexFillRepeat
属性FillStyle设置为flexFillRepeat,表示允许FlexGrid控件一次对一个以上的选中单元进行格式化(在缺省情况下,默认值为flexFillSingle,它只允许一次格式化一个单元)。执行了此条语句之后,就为格式化单个或多个选中单元做好了准备。
注意:如果愿意的话,可以让用户来进行选择。例如,你可以允许用户在FlexGrid控件中选择一组单元,然后单击一个按钮将选中单元的文本风格变为粗体。在运行时,你可以通过设置SelectionMode属性控制用户如何来访问表格,SelectionMode的属性值为下列三个选项之一:flexSelectionFree(正常选择),flexSelectionByRow(只通过行来选择),或者flexSelectionByColumn(只通过列来选择)。
FlexGrid控件提供了许多标准的单元格式化特性(注:有8种单元格式化属性),这些特性你会在商业化的电子数据表格应用程序中见到。这些特性包括:粗体、斜体和下划线格式;列中的文本对齐方式;字体名称和大小,前景颜色和背景颜色。
下表列出了你可以使用的最重要的格式化选项。在后面部分将会练习使用设置其中的大部分属性。
属性 |
示例 |
CellFontBold |
MSFlexGrid1. CellFontBold = True |
CellFontItalic |
MSFlexGrid1. CellFontItalis = True |
CellFontUnderline |
MSFlexGrid1. CellFontUnderLine = True |
CellAlignment |
MSFlexGrid1. CellAlignment = flexAlignRightCenter |
CellFontName |
MSFlexGrid1. CellFontName = "Courier New" |
CellFontSize |
MSFlexGrid1. CellFontSize = 14 |
CellForeColor |
MSFlexGrid1. CellForeColor = "red" |
CellBackColor |
MSFlexGrid1. CellBackColor = "blue" |
添加新行
使用AddItem方法增加新行
当使用FlexGrid控件来创建发货清单、帐目登记或其它表格项目时,你将会发现在电子数据表格的底部增加新行是非常有用的。你可以用AddItem方法来完成此项操作。AddItem方法对FlexControl的作用和它对ListBox与ComboBox控件的作用一模一样。你指定准备增加的一条信息,在不同列的内容要用tab字符(即vbTab常数)隔开。
例如,在FlexGrid控件的底部增加一行新的内容(从第二列开始),可使用下列代码:
Dim Row As String Row = vbTab & "Soccer ball" & vbTab & "W17-233" & vbTab & "34.95" MSFlexGrid1.AddItem Row
如下图所示,以上语句代码将创建新的一行,并且填入soccer ball等的一些信息。

例题:使用FlexGrid控件来跟踪销售数据。
前面学习了FlexGrid控件属性和方法的一些知识,下面练习使用它来创建一个两维的销售表格,按地区跟踪销售情况。
界面设计:
1)在Project(工程)菜单中,单击Components(部件)选项,然后单击Controls(控件)选项卡,选中Microsoft FlexGrid Control 6.0项目左边的复选框,单击OK。将FlexGrid控件添加到工具箱中。
2)在工具箱中单击FlexGrid控件,在窗体上创建一个适当大小的FlexGrid对象,把Cols属性的值设置为4(也可以在运行时用程序代码改变这个值)。
3)添加一个命令按钮Command1,Caption属性的值为“Add Rows”。
窗体界面如图所示:

编写FlexGrid程序代码:
Private Sub Form_Load() With MSFlexGrid1 '使用“With”速记表示法 '给第一列和第二列创建标题 .TextMatrix(0, 1) = "Q1 1999" .TextMatrix(0, 2) = "Q2 1999" '选中标题 .Row = 0 .Col = 1 .RowSel = 0 .ColSel = 2 '把标题设置为粗体格式,并使其在单元中居中显示 .FillStyle = flexFillRepeat '填充完整选项 .CellFontBold = True .CellAlignment = flexAlignCenterCenter '在第一行填加三条内容 .TextMatrix(1, 0) = "International" '第0列为标题 .TextMatrix(1, 1) = "55000" '第1列 .TextMatrix(1, 2) = "83000"
'第2列 End With End Sub
这些语句示范了几种在flex grid对象中输入和管理信息的技术:将文本填入单独的单元、选中一组单元、对选中的一组单元应用粗体格式、使一组单元中每个单元的文本居中显示。
注意:当FlexGrid控件的AllowUserResizing属性设置为1-flexResizeColumns时,用户可以在电子数据表格中改变列的宽度。
Private Sub Command1_Click() With MSFlexGrid1 '每次单击在表格中添加四条信息 .AddItem "North" & vbTab & "45,000" & vbTab & "53,000" .AddItem "South" & vbTab & "20,000" & vbTab & "25,000" .AddItem "East" & vbTab & "38,000" & vbTab & "77,300" .AddItem "West" & vbTab & "102,000" & vbTab & "87,500" End With End Sub
AddItem方法在flexgrid对象中创建一新行,并且在前三列中填入数据。常数vbTab标识了在表格中开始新的一列。
保存文件:
将窗体存为MySaleGrid.frm文件,将工程存为MySaleGrid.vbp文件。
2、用FlexGrid控件显示数据库记录以及它的高级排序和查找操作
你也许已经注意到,向FlexGrid控件中一次添加一行数据显得有些麻烦了。但是,如果把FlexGrid控件连接到你窗体中一个进行了适当配置的Data控件上,那么FlexGrid控件将会表现出强大的文本管理能力。像其它绑定控件一样,Data控件通过适当的设置被连接到FlexGrid控件上的。即将FlexGrid控件的DataSource属性设置为窗体中Data控件的名称。当建立了这个连接后,FlexGrid对象将会自动用数据库的记录来填充表格。
在下面的练习中,将演示如何在窗体中利用FlexGrid控件用表格的形式来来显示数据库记录,并且创建全新的排序和查找的功能。
DataGrid程序以表格的形式显示数据库记录,如果记录较长,DataGrid控件会自动产生滚动条,可以通过滚动条提供对数据的访问。另外,这个程序还演示了对于大型数据库特别有用的两个操作:排序功能,即按列对数据库记录进行排序;查找功能,即根据所给关键字搜索整个数据库并且高亮显示查找的结果。
排序是由FlexGrid控件的Sort属性处理的,它根据一行或多行的关键列和排序方向参数对表进行排序。
查找则需要多写一些程序代码,本例中通过两个For...Next的嵌套循环和InStr函数将每个单元的内容直接与要查找的字符串相比较。在下面的练习中,你将会看到这些事件过程是如何工作的。
例题:用FlexGrid控件完成对数据库的显示、查找、排序的操作。
在窗体上添加一个Date控件(Visible属性被设置为False)、一个FlexGrid控件(将两者绑定)、两个命令按钮、一个文本框、一个进度条(在Microsoft Wintows Common Controls 6.0中)。
界面如下:

单击“排序”按钮的代码:
Private Sub Command2_Click() '将第二列设置为排序的关键列 MSFlexGrid1.Col = 2 '以升序方式对表格进行排序 MSFlexGrid1.Sort = 1 End Sub
程序说明:这个简单的事件过程使用了两行语句来排序FlexGrid对象中所有的数据库内容。第一条语句将第二列设置为用于排序的比较关键字。当然,数据库表中其它列也都可以作为排序列。排序操作本身通过Sort属性执行,它使用0到9的整数作为参数指明排序的方向。这里选择了参数1(一般意义上的升序),它意味着控件按照字母顺序对单元进行排序,并且在排序开始之前猜测单元中是否包含数字或字符串。
常用的选项有:
1——升序排序。
2——降序排序。
3——数值升序排序(在数值排序中,在排序开始之前字符串被转化为数字(字符相应的ASCII码值))。
4——数值降序排序。
注意:实际上,数据库中内部的顺序并没有因为这个排序操作而改变,改变的只是FlexGrid电子数据表格的内容。Data控件和FlexGrid控件之间的联系是单向的,因此,你在FlexGrid对象中所做的修改并不更新数据库。
单击“查找”按钮。
Private Sub Command1_Click() '选择整个表格并去掉粗体格式 '(去掉上一次查找的结果,因为查找后的结果用粗体显示) MSFlexGrid1.FillStyle = flexFillRepeat MSFlexGrid1.Col = 0 MSFlexGrid1.Row = 0 MSFlexGrid1.ColSel = MSFlexGrid1.Cols - 1 MSFlexGrid1.RowSel = MSFlexGrid1.Rows - 1 MSFlexGrid1.CellFontBold = False '初始化进度条以跟踪搜索过程,使得每检查一行,进度条填充一次 ProgressBar1.Min = 0 ProgressBar1.Max = MSFlexGrid1.Rows - 1 ProgressBar1.Visible = True '依次在各单元中查找匹配字符串
MSFlexGrid1.FillStyle = flexFillSingle For i = 0 To MSFlexGrid1.Cols - 1 For j = 1 To MSFlexGrid1.Rows - 1 '在进度条中显示当前行的位置 ProgressBar1.Value = j '如果当前单元与所查找字符串匹配 If InStr(MSFlexGrid1.TextMatrix(j, i), Text1.Text) Then '选中单元并将其格式化为粗体格式 MSFlexGrid1.Col = i MSFlexGrid1.Row = j MSFlexGrid1.CellFontBold = True End If Next j Next i ProgressBar1.Visible = False '隐藏进度条 End Sub
Private Sub Form_Load() MSFlexGrid1.FixedCols = 0'把电子数据表格中作为标题的列压缩掉(缺省情况下,flexgrid对象的第一行和第一列以灰色阴影显示,但是你可以通过把FixedCols或FixedRows属性设置为0来清除这些阴影)。 End Sub
程序说明:当用户单击Form2中的Find Text按钮时,cmdFindText_Click事件过程就会运行。程序的目的是把FlexGrid对象中每一个单元的内容和文本框Text1中的查找文本进行比较,然后把所有匹配成功的单元以粗体的格式显示。此事件过程首先通过选中整个电子数据表格并把属性CellFontBold置为False,清除了FlexGrid对象中所有已经存在的粗体格式。然后,该事件过程初始化进度条对象,以便搜索过程中在屏幕底部以图形方式指示进度(每处理表中的一列数据就填充一次进度条)。
FlexGrid使用两个For...Next循环来完成搜索:一个循环实现表中行的扫描,另一个循环实现列的扫描。然后,循环使用TextMatrix属性和InStr函数把当前循环的位置(j,i)和查找文本串(Text1.Text)进行比较。如果匹配成功,属性CellFontBold就将单元中文本的格式设置为粗体。
本节内容总结:
目的 |
执行步骤 |
增加FlexGrid ActiveX控件到工具箱中 |
选中Microsoft FlexGrid Control 6.0项目前面的复选框 |
将文本赋值给FlexGrid的单元 |
利用TextMatrix属性。例如,将单词“Bob”放入单元3,1(第3行,第1列)中时,键入下列语句: MSFlexGrid1.TextMatrix(3,1) = "Bob" |
在单元中插入图形 |
利用CellPicture属性。例如: Set MSFlexGrid1.CellPicture = LoadPicture("c:\ABC\coins.wmf") |
选中一个单元 |
同时使用Row和Col属性。例如,要选中单元1,1(第1行,第1列),那么键入语句: MSFlexGrid1.Row = 1 MSFlexGrid1.Col = 1 |
用粗体格式格式化当前选中内容 |
利用CellFontBold属性。例如:MSFlexGrid1. CellFontBold = True |
添加新的一行 |
使用AddItem方法,用tab字符(vbTab)分开不同列单元的内容。例如: Dim Row As String Row = "Soccer ball" & vbTab & "W17-233" MSFlexGrid1.AddItem Row |
按列对flex grid对象中的内容进行排序 |
使用Col属性设置排序关键字,然后用方向参数设置Sort属性。例如:MSFlexGrid1.Col = 1 '把第1列设为关键字 MSFlexGrid1.Sort = 1 '按照升序进行排序 |
在整个FlexGrid对象中搜索文本框中的文本 |
在两个For...Next循环中使用InStr函数。例如: For i = 0 To MSFlexGrid1.Cols - 1 For j = 1 To MSFlexGrid1.Rows - 1 If InStr(MSFlexGrid1.TextMatrix(j, i),Text1.Text) Then [如果匹配成功要执行的代码] End If Next j Next I |
|