下面我给大家讲一下MSHFLEXGRID常用的属性,方法事件,还有一些不能不知道的技巧.
1) MSHFLEXGRID的重要属性.
MSHFLEXGRID的属性非常多,其实绝大部分的属性和网格的显示的外观有关.在MSDN里,这些属性足以将人搞得眼花缭乱的了(我相信你没有耐性一个一个地翻查).
下面列出常用的属性,方法事件及其简要说明.以便查阅.
属性 类型 说明
AllowBigSelector Boolean 返回/设置一个值,定义当在行或列的头部单击时,是否该行或列将整个被选中
AllowUseResizing Enum 设置/返回一个值,定义用户是否可以调整网格行,列的尺寸
BackColor Ole_Color 设置/返回一网格中非固定单元的背景色
BackColorBand Array/Ole_Color 设置/返回网格中每个独立BAND的背景色
BachColorBkg Ole_Color 设置/返回网格的背景色(单元头部除外)
BackColorFixed Ole_Color 设置/返回网格中固定单元的背景色
BackColorHeader Array/Ole_Color 设置/返回网格头部单元的背景色
BackColorIndent Array/Ole_Color 设置/返回网格中凹痕部分的背景色
BackColorSel Ole_Color 设置/返回网格选中单元的背景色
BackColorUnpopulated Ole_Color 设置/返回网格非用户操作区的背景色
BandData Array/Long 为独BAND设置/返回任意的值,以合在代码中通过这些值确定BAND
BandDisplay Enum 定义在网格中BAND是水平还是垂直显示
BandExpandable ARRAY/BOOLEN 设置/返回值指明独立的BAND能否被折叠或展开
BandIndent Array/Long 定义BAND划分的字段数量
BandLevel Long 返回当前的单元包含的BAND总数量
Bands Long 返回网格中BAND总数量
CellAlignment Integer 设置/返回一个值以定义当前单元的水平和垂直对齐方式
CellBackColor Ole_Color 定义当前单元的字体是否为粗体
CellFontBold Boolean 定义当前单元的字体是否为粗体
CellFontItalic Boolean 定义当前单元的字体是否为斜体
CellFontName String 定义当前单元的字体名
CellFontSize String 定义当前单元的字体大小
CellFontStrikeThough Boolean 定义当前单元的字体是否为突显示
CellFontUnderline Boolean 定义当前单元的字体是有下划线
CellFontWidth Single 定义当前单元的字体宽(用点表示)
CellFontColor Ole_Color 设置/返回当前单元格的前景色
CellHeight Long 设置/返回当前单元格的高度
CellLeft Long 返回当前单元格的左边距
CellPicture StdPicture 设置/返回当前单元格的图片
CellPictureAlignment Integer 设置/返回当前单元格或某范围的单元格的图像对齐方式
CelltextStyle Enum 设置/返回当前单元或选中范围单元文本的3D风格
CellTop Long 返回当前单元格的垂直位置
CellType Enum 设置/返回当前单元格的类型(标准.固定)
CellWidth Long 返回/设置当前的单元的宽度
Clip String 设置/返回网格选定范围单元的内容
Col Array/Integer 设置/返回当前单元的水平坐标
ColAlignment Array/Integer 设置/返回当前列的对齐方式
ColalignmentBand Array/Integer 设置/返回BAND数据列的对齐方式
ColAlignmentFixed Array/Integer 设置/返回固定单元数据的对齐方式
ColAlignmentHeader Array/Integer 设置/返回固定头部单元数据的对齐方式
ColData Ayyay/Long 为独立列设置/返回任意的值,以合在代码中通过这些值确定列
ColHeader Array/Enum 定义每个BAND头部是否显示
ColHeaderCaption Array/Single 定义每个BAND的列头部显示的文本
ColIsVisible ARRAY/BOOLEN 返回/设置某个列是否可见
ColPos Array/Long 返回某个给定列的左上角和网格左上角的距离
Colposition Array/Long 设置网格列的位置
Cols Long 返回/设置网格的列数量
ColSel Array/Long 设置/返回某个范围单元的起始列
ColWidth Array/Long 设置/返回某个列的宽度
ColWordWrapOption Array/Integer 设置/返回网格的非固定单元是否允许WRAP
ColWordWrapOptionBand Array/Integer 定义网格的BAND是否允许WRAP
ColWordWrapOptionFixed Array/Integer 定义列的固定单元是否允许WRAP
ColWordWrapOptionHeader Array/Integer 定义各头部是否允许WRAP
DataField Array/Single 一个独立列绑定的数据库字段
FillStyle Enum 定义改变文本或单元的其他属性是影响所有的选中单元还是只影响活动单元
FixedCols Long 设置/返回固定列的列数
FixedRows Long 设置/返回固定行的行数
FocusRect Enum 定义控件对当前单元的焦点表示
Font StdFont 返回/设置默认字体或各单元使用的字体
FontBand Array/StdFont 设置/返回各BAND使用文本的字体
FontFixed Single 设置/返回固定单元使用的字体
FontHeader Array/StdFont 设置/返回各头部使用的字体
FontWidth Single 设置/返回默认字体宽度
FontWidthBand Array/Single 设置/返回BAND使用的字宽
FontWidthFixed Single 设置/返回固定单元使用的字宽
FontWidthHeader Array/Single 设置/返回每个头部使用的字宽
ForeColr Ole_Color 设置/返回网格非固定单元使用的前景色
ForeColorBand Array/Ole_Color 设置/返回网格各BAND的前景色
ForeColorFixed Ole_Color 设置/返回网格固定单元的前景色.
ForeColorHeader Array/Ole_Color 设置/返回网格头部单元的前景色
ForeColorSel Ole_Color 设置/返回设置单元的前景色
FormatString String 定义一个格式串用来设置网格列的宽度,对齐方式,固定行文本固定列文本
GridColor Ole_Color 设置/返回网格单元间的线的颜色
GridColorBand Array/Ole_Color 设置/返回网格BAND的线的颜色
GridColorFixed Ole_Color 设置返回网格固定单元间的线的颜色
GridColorHeader Array/Ole_Color 设置/返回网格头部间的线的颜色
GridColorIndent Ole_Color 设置/返回网格INDENT单元间的线的颜色
GridColorUnpopulated Ole_Color 设置/返回网格UNPOPULATED区域间的颜色
GrigLine Enum 定义网格单元间的线的类型
GrigLinesBand Array/Enum 定义网格各BAND间的线的类型
GrigLinesFixed Enum 定义网格固定单元的线的类型
GrigLinesHeader Array/Enum 定义网格各头部间的线的类型
GrigLinesIndent Array/Enum 定义网格INDENT单元间的线的类型
GrigLinesUnpopulated Enum 定义网格UNPOPULATED区域间的线的类型
GrigLinesWidth Integer 设置/返回网格单元间的线的宽度
GrigLinesWidthBand Array/Integer 设置/返回网格各BAND间的线的宽度
GrigLinesWidthFixed Integer 设置/返回网格固定单元间的线的宽度
GrigLinesWidthHeader Array/Integer 设置/返回网格各头间的线的宽度
GrigLinesWidthIndent Array/Integer 设置/返回网格INDENT单元间的线的宽度
GrigLinesWidthUnpopulated Integer 设置/返回网格UNPOPULATED区域间的宽度
Hieght Enum 定义如何以及何时高亮度显示网格的选中单元
LeftCol Long 网格最械的可见列
MergeCells Enum 设置/返回一个值表明如何及何时将有相同内容的记录进行合并
MergeCol ARRAY/BOOLEN 设置/返回一个值表明哪些列可以将内容合并
MergeRow ARRAY/BOOLEN 设置/返回一个值表明哪些行可以将内容合并
MouseCol Long 返回鼠标光标的列坐标位置
MouseRow Long 返回鼠标光标的行坐标位置
Picture StdPicture 返回MSHFLEXGRID的控件快照
PictureType Enum 设置/返回PICTURE类型
Redraw Boolean 设置/返回一个值,表明MSHFLEXGRIDR控件是否在每个改变后重画
Row Long 设置/返回当前单元的垂直坐标
RowData Array/Long 为各行设置/返回任意的值,以合在代码中通过这些值确定行
RowExpandable Boolean 定义当前行是否可以展开
RowExpanded Boolean 返回一个值表明当前行是否展开
RowHeight Array/Long 设置/返回各行的高度
RowHeightMin Long 设置/返回网格中行的最小高度
RowIsVisible ARRAY/BOOLEN 设置/返回一个值,表明某个特定列是否可见
RowPos Array/Long 返回给定行左上角和MSHFLEXGRID控件左上角的距离
RowPosition Array/Long 设置某个网格行的位置
Rows Long 返回网格的行的总数或者或BAND的行的总数
RowSel Long 设置/返回一个范围的单元的起始行
RowSizingMode Enum 设置/返回一个值表明对一行的设置是影响网格的所有行还是只影响被调整的行
ScrollBars Enum 设置/返回一个值表明MSHFLEXGRID控件的滚动条类型
ScrollTrack Boolean 设置/返回一个值表明网格内容是在用户移动滚动条时随着改变还是滚动结束后改变
SelectionMode Enum 设置/返回一个值表明MFHFLEXGRID控件允许的选择类型.
Sort Enum 根据某些村准备设置排序的值
Text String 设置/返回一个单元或一个范围内单元的文本内容
TextArray array/string 不改变ROW,COL属性,设置/返回任意单元的文本内容
TextMatrix array/string 设置/返回某个选定行,列的单元的文本内容
TextStyle Enum 设置/返回网格通常单元的3D文本风格
TextStyleBand Array/Enum 设置/返回网格BAND的3D文本风格
TextStyleFixed Enum 设置/返回网格各固定行的3D文本风格
TextStyleHeader Array/Enum 设置/返回网格各头部的3D文本风格
TopRow Long 设置/返回网格最上面的可见行
Version Integer 返回正在使用MSHFLEXGRID控件的版本
WordWrap Boolean 定义当到达单元的边界时,网格的单元的内容是否WRAP
2) MSHFLEXGRID控件的重要方法
方法 说明
AddItem 向网格中加入一新行
Clear 清除网格中的内容
ClearStructure 清除网格的结构(映射信息)
CollapseAll 折叠网格的某个特定的所有行
ExpandAll 展开网格的某个特定的所有行
RemoveItem 从网格中清除一行
方法AddItem和RemoveItem可以用来向网格中加入或删除行(BANDS).如果折叠或展开某个BAND的所有行,则可以使用COLLAPSEALL和EXPAANDALL方法.
方法CLEAR可以清除网格中的内容,但不影响网格的行,列数,如果要清除网格的结构,包括顺序及网格各列的名称,应当使用ClearStructure方法.
3) MSHFELXGRID的控件的主要事件
Collapse 用户折叠了网格的一行
Compare 当SORT属性被设置为CUSTOMERSORT,允许用户定义排序过程
EnterCell 当一个新的单元成为当前活动单元时
Expand 用户展开了网格的一行
LeaveCell 当一个新单元成为当前活动单元前
RowColChange 当一个新单元成为当前活动单元时
Scroll 用户用键盘,滚动条滚动网格的内容或网格的内容由程序滚动时
SelChangeEvent 一个新范围内的单元被选中
EnterCell, LeaveCell, RowColChange事件相互联系,因为字们都在当一个新单元成为当前活动单元时被激发,实际上这些事件的顺序是:LeaveCell, EnterCell然后是RowColChange.
Collapse和Expand事件在用户折叠或者展开网格的一行(BAND)时被激发.属性ROW和COL可以用来确定用户折叠或者展开的单元.
当SORT属性设置为9时,对网格的每两行发生一次COMPARE事件,用户排序方法使你可以选择按照午任意列或单元对行排序.注意,使用这种排序方式的速度会慢于BUILD-IN排序.
不论采用何种方式,只要对网格进行滚动时,SCROLL事件就会被激发.当SCROLLTRACK属性设置为TRUE时,如果用户用鼠标拖动或滚动时,该事件也被激发,如果SCROLLTRACK属性被设置为FALSE时,SCROLL事件只在拖动结束后激发一次.
当选择单元格变化时, SelChangeEvent事件会被激发,对选择的单元范围的改变,可以通过用户操作或程序代码来实现.
1) MSHFLEXGRID的编辑.
关于MSHFLEXGRID的编辑,很多书都有介绍.一般都是用一个TEXTBOX作为的输入框,通过移动TEXTBOX来达到类似于EXCEL的编辑功能.很多书介绍的方法是在MOUSEDOWN或CLICK事件中移动TEXTBOX,然后,再在LeaveCell事件中写入.
本文的方法与其有类似之处,但亦有小许不同,主要在写入网格时,在TEXTBOX的Change事件中写入.
2)网格内容的保存与加载
对于网格的保存,一般人喜欢使用.Clip属性,将整个网格一次性地写入一个文件中,当然,在文件不大时,这当然是一个好办法.但是,当网格达到几千行几万行时,这个方法好象不是很好.(各位如果有兴趣的话,可以试试下面的程序)
‘将网格设置成5000*12,然后用随机数填充网格.然后,调用下面程序
Private Sub Command4_Click()
Dim msgStr As String
Dim FileID As Long
Dim T1 As Date
Dim T2 As Date
T1 = Timer()
With MSHFlexGrid1
.Row = 0
.Col = 0
.RowSel = .Rows - 1
.ColSel = .Cols - 1
FileID = FreeFile
msgStr = .Clip
Open "C:/LX.TXT" For Output As #FileID
Print #FileID, msgStr
Close #FileID
End With
T2 = Timer()
MsgBox T2 - T1
End Sub
反正我的感觉是:好象死机一般,要过一分多钟后计算机才能反应过来(实测是82.5秒左右,我的计算机是:AMD2500+,512M内存).
为什么一次性的写入会如此的慢呢?这大概是有的人想不到的地方.其实,这跟VB处理字符串的机制有关,如果处理5K的字符串要一秒的话,那么,处理30K的字符串绝不是处理5K的6倍,而是长得多.这种关系几乎是呈某种几何级数的关系.
明白了VB原来处理大字符串的效率原来是这么底.那么,解决的办法自然就有了.就是一个字:拆,将大拆小将会大大地加快处理字符串的速度.
所以,下面的网格的保存函数的主要思想就将网格中的数据分步保存,每一次保存一小部分.直到整个网格保存完成.当然,其中还有一些细小的技巧,例如:保存时将先将网格中的行,列,固定行,固定列的总数保存,然后,保存各列的宽度,再然后正式保存数据.这都是为了加载的方便与快捷作了一定的处理.(参考下面的程序)
Option Explicit
Dim m_Row As Long
Dim m_Col As Long
Private Sub Command3_Click()
'填充网格
Dim R As Long
Dim C As Long
For R = 0 To MSHFlexGrid1.Rows - 1
For C = 0 To MSHFlexGrid1.Cols - 1
MSHFlexGrid1.TextMatrix(R, C) = R & C
Next
Next
End Sub
Private Sub Form_Load()
With MSHFlexGrid1
Text1.Visible = False
.RowHeight(-1) = 285
'设定网格是5000行.12列.
.Rows = 5000: .Cols = 12
End With
End Sub
'保存文件
Private Sub Command1_Click()
Call SaveFile(MSHFlexGrid1, "c:/kk.grd")
End Sub
'加载文件
Private Sub Command2_Click()
Call LoadFile(MSHFlexGrid1, "c:/kk.grd")
End Sub
Private Sub MSHFlexGrid1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
Text1.Visible = False
With MSHFlexGrid1
m_Row = .MouseRow
m_Col = .MouseCol
If m_Row < .FixedRows Then m_Row = .FixedRows
If m_Col < .FixedCols Then m_Col = .FixedCols
.Row = m_Row: .Col = m_Col
Text1.Move .Left + .CellLeft, .Top + .CellTop, .CellWidth, .CellHeight
Text1.Text = .Text
Text1.Visible = True
Text1.SetFocus
End With
End Sub
Private Sub Text1_Change()
With MSHFlexGrid1
.TextMatrix(m_Row, m_Col) = Text1
End With
End Sub
'//**以下是相应的功能函数
'
'加载一个文件到表格