MSFlexGrid控件概述
1、作用:该控件以表格形式显示二维字符数组中每个单元的数据。常用于处理复杂的二维数据表的问题。如校历表、学生宿舍表、学生班级成绩表等。
2、添加到控件箱
菜单命令:工程 | 部件,在部件对话框中选择:Microsoft FlexGrid Control 6.0 (SP6)。
3、主要属性
(1)Rows与Cols属性:分别用于设置或返回MSFlexGrid控件的行数与列数。
(2)Row与Col属性:分别用于设置或返回MSFlexGrid控件中活动单元的行号与列号。(3)TextMatrix属性:该属性用于表示MSFlexGrid控件中单元格的内容。
格式为:TextMatrix (Row, Col);
其中Row与Col分别表示单元格在MSFlexGrid控件中的行号与列号。
(4)FixedRows属性:用于设置表格显示过程中固定不变的行数。如FixedRows=1,则表示固定行为1,如图8.3中第1行。
(5)FixedCols属性:用于设置表格中固定不变的列数。如FixedCols=1,则表示固定列为1,如图8.3中第1列。
(6)FixedColor属性:用于设置固定行与固定列的颜色。
(7)MouseRow与MouseCol属性:用于返回鼠标光标所在单元格的行号与列号。
(8) ColWidth(Col)、RowHigh(Row)属性:用于设置与返回第Col列的宽度与第Row 行的高度,例如设置第0列的宽度为1500,第0行的高度为300的赋值语句为:ColWidth(0) = 1500
RowHeight(0) = 300
(9)DataSource属性:用于选择数据表,只能通过Data数据源控件选择数据表。
说明,若要用ADO Data控件作为数据源,则应使用MSHFlexGrid控件。
(10)MousePointer属性:用于设置鼠标光标形状,属性取值与光标形状如表8.1所示。
【例8.1】编写程序,定义MSFlexGrid1控件为10行、5列表格,给每一个单元格赋值为Row+Col,其中Row与Col分别表示控件单元格的行号与列号。
新建一个工程(ex8_1.vbp),窗体名为Form_ex81.frm。在窗体上添加一个MSFlexGrid控件与一个Command控件,双击Command控件,输入如下程序:
Private Sub Command1_Click()
Dim Row, Col As Integer '定义两个变量用于接收表格的行与列
With MSFlexGrid1
.Rows = 10'定义表格为10行
.Cols = 5'定义表格为5列
For Row = 0 To .Rows - 1
For Col = 0 To .Cols - 1
.TextMatrix(Row, Col) = Row + Col '将表格中的每一个单元格赋值为Row+Col
Next Col
Next Row
End With
End Sub
运行程序后的界面如图8.3所示。
1、MSFlexGrid控件的事件
(1)KeyPress事件:当用户按下或释放任何一个ANSI键(字母或数字等键)时触发。定义:Private Sub <控件名>_KeyPress(KeyAscii As Integer)
其中,形参KeyAscii用于将用户按下或释放的ANSI键值传送给KeyPress过程。
(2)KeyDown事件:当用户按下一个键时触发。
定义:Private Sub <控件名>_KeyDown(KeyCode As Integer, Shift As Integer)其中,形参KeyCode用于表示用户按键的类型,取值如表8.3所示。形参Shift用
于表示用户所按组合键(Ctrl、Alt、Shilt)的键值,取值如表8.4所示。
(3)KeyUp事件:当用户放开任何一个键时触发。
定义:Private Sub <控件名>_KeyUp(KeyCode As Integer, Shift As Integer)
其中参数KeyCode与Shift的取值见表8.3与表8.4。
(4)MouseDown事件:当用户按下鼠标触发。
定义:Private Sub <控件名>_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
其中,形参Button表示用户按下的是鼠标左键、中键还是右键,取值如表8.5所示。形参Shift取值类型见表8.4。x、y为鼠标光标在控件内的位置坐标,单位为缇。
2、MSFlexGrid控件的方法
(1)Clear方法:清除MSFlexGrid控件所有单元格中内容。
语句格式:MSFlexGrid.Clear
(2)AddItem方法:在MSFlexGrid控件中添加一个新行。
语句格式:MSFlexGrid.AddItem(String,Index,Number)
String为新增行中的字符串,用Tab键作为一行中各单元格字符串的分隔符。
Index为新增行的行号,若省略则添加到最后一行。
Number为添加行的带区号。
(3)RemoveItem方法:在MSFlexGrid控件中删除一行。
语句格式:MSFlexGrid. RemoveItem (Index,Number)
Index为要删除行的行号。
Number为要删除行的带区号。
【例8.2】在MSFlexGrid控件上实现九九乘法表,并实现鼠标拖弋功能,即用鼠标
拖动方法,将某单元格内容移动到另一个单元格中,或复制到另一个单元格中,如图8.4所示。
图8.4 用MSFLexGrid控件实现九九乘法表
设计步骤:
1、新建工程与窗体,在窗体上放置一个“退出”按钮、一个“计算九九乘法表”按钮和一个MSFlexGrid控件,设计步骤与属性设置演示:
1、新建工程与窗体,在窗体上放置一个“退出”按钮、一个“计算九九乘法表”按钮和一个MSFlexGrid控件,设计步骤与属性设置演示:
观看视频
2、编写代码实现九九乘法表及鼠标拖弋功能
(1)定义全局变量
在窗体的通用与声明部分定义四个全局变量:
Dim Cell As String, Ctrl As Boolean, Col As Long, Row As Long
其中:Cell:用于传送单元格内容;
Ctrl:用于判断是否按下“Ctrl”键;
Col,Row:用于记录原单元格行号与列号。
(2)编写“计算九九乘法表”命令按钮事件处理过程
双击“创建九九乘法表”按钮,编写如下事件处理过程。
Private Sub Command_Calculate_Click()
Dim I As Integer, J As Integer
With MSFlexGrid1
.Clear ‘清除所有单元格内容
For J = 1 To 9
.TextMatrix(0, J) = J ‘在第0行赋数字1~9
Next J
For I = 1 To 9
.TextMatrix(I, 0) = I ‘在第0列赋数字1~9
For J = 1 To 9
.TextMatrix(I, J) = CStr(I) & "*" & CStr(J) & "=" & CStr(I * J) ‘赋九九乘法表的内容
Next J
Next I
End With
End Sub
(3)编写鼠标拖弋程序
在某单元格按下鼠标左键时,触发MouseDown事件处理过程,在该过程中将光标形状改为“flexArrow ”,并将该单元格内容存放在全局变量Cell中。
拖弋鼠标到另一个单元格,放开鼠标左键,触发MouseUp事件处理过程。在该过程中将光标形状恢复为“flexCross ”,并将全局变量Cell中内容赋给现单元格,另将前单元格内容删除。于是前单元格的内容被移动到后单元格中,从而实现鼠标的拖弋功能。
若按下“Ctrl”键拖动鼠标时,光标形状改为“flexHourglass”,松开鼠标后。前一个单元格的内容被复制到后一个单元格中。
①键按下事件处理过程KeyDown
该过程用于判断是否按下“Ctrl”键。若按下“Ctrl”键则将全局变量Ctrl赋True值,表示用户按下了“Ctrl”键。Private Sub MSFlexGrid1_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyControl Then
Ctrl = True
End If
End Sub
②键松开事件处理过程KeyUp
该过程用于判断是否松开“Ctrl”键。若松开“Ctrl”键则将全局变量Ctrl赋Flase值,表示用户松开“Ctrl”键。
Private Sub MSFlexGrid1_KeyUp(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyControl Then ‘也可用Shift= vbCtrlMask作为松开Ctrl键的判断条件
Ctrl = False
End If
End Sub
③鼠标按下事件处理过程MouseDown
在该过程中将光标形状改为“flexArrow ”,并将该单元格内容存放在全局变量Cell中,将单元格的行号与列号赋给全局变量Row与Col。
Private Sub MSFlexGrid1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
With MSFlexGrid1
Row = .MouseRow ‘单元格的行号赋给Row
Col = .MouseCol ‘单元格的列号赋给Col
Cell = .TextMatrix(.MouseRow, .MouseCol) ‘单元格的内容赋给Cell If Ctrl = False Then
.MousePointer = flexArrow ‘若未按Ctrl键则光标为箭头形
Else
.MousePointer = flexHourglass ‘若按下Ctrl键则光标为
杯形
End If
End With
End Sub
④鼠标松开事件处理过程MouseUp
在该事件中将Cell中内容赋给当前单元格,当Ctrl=False时清除行号、列号为Row 与Col的原单元格内容,完成一次单元格内容的移动操作(Move);否则不清除原单元格内容完成一次复制操作(Copy),最后将光标恢复成“flexCross”(十字型)。Private Sub MSFlexGrid1_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
With MSFlexGrid1
If Ctrl = Flase Then
.TextMatrix(Row, Col) = "" ‘若未按Ctrl键则原单格清空
End If
.TextMatrix(.MouseRow, .MouseCol) = Cell ‘将Cell中原单元格内容赋给当前单元格
.MousePointer = f lexCross‘光标恢复十字型
End With
End Sub
2、学生宿舍录入程序设计
【例8.3】在学生档案管理系统(xsdagl.vbp)中,编写学生宿舍录入程序,如图8.5所示。要求用命令对象与MSFlexGrid控件实现学生宿舍录入工作。
1、程序设计思路
(1)用数据源控件Data_XA01打开学生档案表XA01中指定班级的学生记录。
(2)将MSFlexGrid控件的DataSource属性设置为Data_XA01,使MSFlexGrid控件能显示学生的班内序号、学号、姓名、性别与宿舍号。
(3)用一个TextBox控件跟随MSFlexGrid控件单元格移动,实现学生宿舍号的输入。(4)用命令对象Cmd执行Update语句,将MSFlexGrid控件中宿舍号写入学生档案表的宿舍字段中去。
2、程序设计步骤
观看视频
3、重要代码
(1)编写单击班级显示学生信息(班内序号、学号、姓名、性别、宿舍号)程序Private Sub DataGrid_TB03_Click()
Dim BJ As String
BJ = Adodc_TB03.Recordset("TB0301")
Data_XA01.RecordSource = "Select XA0103,XA0102,XA0104,GC0102,XA0119 from XA01,GC01" & _
" Where XA0106=GC0101 and XA0114 ='" & BJ & "'"‘选择指定班级的学生信息
Data_XA01.Refresh
With MSFlexGrid_XA01
.Refresh
.TextMatrix(0, 0) = "序号"‘表格控件第1行赋上列标题
.TextMatrix(0, 1) = "学号"
.TextMatrix(0, 2) = "姓名"
.TextMatrix(0, 3) = "性别"
.TextMatrix(0, 4) = "宿舍"
End With
End Sub
(2)编写文本框跟随光标在字符表格控件中移动的程序。当用户用鼠标单击字符表格控件的某个单元格时,文本框跟随光标移动到该单元格且与单元格同大小同位置,其中,TextBox控件的Name属性为Text。
Private Sub MSFlexGrid_XA01_Click()
With MSFlexGrid_XA01
If .Col = 4 And .Row >= 1 Then ‘若光标在字符表格控件的第4列(且≥第1行),则
Text.Width = .CellWidth ‘使文本框与单元格同宽度
Text.Height = .CellHeight ‘使文本框与单元格同高度
Text.Left = .CellLeft + .Left ‘使文本框与单元格左对齐
Text.Top = .CellTop + .Top ‘使文本框与单元格顶对齐
Text.Text = .Text ‘将单元格内容赋给文本框
Text.Visible = True ‘显示文本框
Text.SetFocus ‘设置文本框为当前焦点
End If
End With
End Sub
(3)在字符表格控件上按回车键,将光标与文本框下移一行的程序
Private Sub MSFlexGrid_XA01_KeyDown(KeyCode As Integer, Shift As Integer) With MSFlexGrid_XA01
If .Row < .Rows - 1 Then ‘当前行号Row小于总行数时,使行号Row加1
.Row = .Row + 1
End If
If KeyAscii = vbKeyReturn Then ‘若按回车键,则调用文本框跟随光标移动的程序
Call MSFlexGrid_XA01_Click
Else
Text.Visible = False ‘否则,不显示文本框
.SetFocus ‘焦点返回MSFlexGrid_XA01控件End If
End With
End Sub
(4)文本框上按键处理程序
Private Sub Text_KeyPress(KeyAscii As Integer)
With MSFlexGrid_XA01
Select Case KeyAscii
Case vbKeyEscape ‘在文本框上按ESC键,文本框不显示
Text_XA01.Visible = False
.SetFocus
Case vbKeyReturn ‘在文本框上按回车键.Text = Text.Text ‘则将文本框内容赋给单元格
If .Row < .Rows - 1 Then ‘若当前行号未到最后一行.Row = .Row + 1 ‘则当前行号Row加1,使文本框下移一行
Call MSFlexGrid_XA01_Click ‘调用文本框跟随光标移动的程序End If
End Select
End With
End Sub
(5)将MSFlexGrid_XA01中宿舍号保存到XA01中去的程序
Private Sub Save()
Dim SH As String, SS As String, Row As Integer
With MSFlexGrid_XA01
For Row = 1 To .Rows – 1 ‘从第1行到最后一行
SH = .TextMatrix(Row, 1) ‘将学号赋给SH
SS = .TextMatrix(Row, 4) ‘将宿舍号赋给SS
https://www.doczj.com/doc/9d14626669.html,mandText = " Update XA01 Set XA0119='" & SS & "'" & _
" Where XA0102='" & SH & "' " ‘用命令对象Cmd执行Update语句,Cmd.Execute ‘将SH指定学号的学生记录中宿舍号更新为SS的内容
Next Row
End With
End Sub
(6)工具栏按钮单击事件
Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
Select Case Button.key
Case "Exit"
Unload Me ‘退出
Case "Save"
Call Save ‘调用保存过程,将新宿舍号存入学生档案表XA01中。
End Select
End Sub
树形结构控件TreeView
TreeView是一种能以树形目录结构形式显示数据的高级控件,显示方式类似于Windows的资源管理器,能分层展开各结点的子目录,也能收缩各结点的子目录。本节将先介绍TreeView控件的一些基本概念、属性与方法,再举例说明TreeView控件的应用。