荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Jobs (温少), 信区: Visual
标  题: MSFlexGrid的技巧和方法
发信站: BBS 荔园晨风站 (Mon Mar  6 11:06:19 2000), 转信


MSFlexGrid的技巧和方法

简介

Microsoft Visual Basic 5.0版的控件箱中包含既不是一个,也不是两个,而是
三个表格控件。这三个控件分别是Grid、DBGrid和MSFlexGrid。实际上有不少很
好的理由可以将这三种控件归于一类,在对这些理由进行简要的探究之后,本文将
对这三个控件中最新的一个--MSFlexGrid进行深入的研究。


Grid是Visual Basic的早期表格控件,它最早出现在1991年的Visual Basic 1.0
的专业工具包(Professional Toolkit)中。而DBGrid是Apex TrueGrid控件的一
个版本,它首先出现在1995年的Visual Basic 4.0中。这三个表格控件中最新的
一个是MSFlexGrid,它是VideoSoft VSFLEX控件的一个版本,MSFlexGrid控件首
先出现在Visual Basic 5.0中。


在仅有Grid表格控件和DBGrid表格控件时,Grid由于其简单性并且只有DBGrid的
六分之一大小,所以深受喜爱。你也许会在偶然之间发现并喜爱上这个最小的表
格控件,但是在大多数情况下,编程人员会忽视 Grid控件。在现今工具箱中存在
的该控件仅仅具有向后兼容性,当MSFlexGrid加入到表格控件的家族中时,就可
以不必再要求这样的兼容性了,这是因为MSFlexGrid几乎支持表格控件的所有的
属性、方法和事件。MSFlexGrid只有Grid控件的两倍大小,但是它极大地丰富了
属性集,并且相当好地替代了现存项目中的Grid控件。


选用哪一个表格控件是非常现实的问题,它可以简化为在DBGrid和MSFlexGrid之
间进行选择。这两个表格控件都具有所有的表格属性并具有高度的可定制性,在
它们之间有一些显而易见的差异,但是这种差异非常少。一方面,如果你需要全
部的数据绑定,那么选用DBGrid,如果你进行MSFlexGrid绑定,那么这种绑定将
仅仅支持只读绑定。另一方面,如果你需要单元合并或数据透视,那么
MSFlexGrid将是你唯一的选择。除此之外,每一种表格控件都具有自己的外观和
风格,但是MSFlexGrid由于更加小型化而具有明显的优点。

当你使用MSFlexGrid时,可以具有相当的灵活性。以下将针对你在使用
MSFlexGrid时能够采用的各种技术进行讨论,并同时提供一些例子程序。


将数据移入表格

将数据移入表格有非常多的方法,但是它们之中并没有正式的推荐使用的方法,
而且各种方法在速度方面并不存在多少差别,因此选用何种方法仅仅取决于数据
的来源和个人的喜好。对于包含在数据库中的数据来说,显而易见的选择标准是
使数据表格和Data控件的绑定简单化,一旦你设置了Data控件的DatabaseName和
RecordSource属性,那么就可以简单地利用MSFlexGrid的DataSource将表格绑定
到Data控件。表格将能够自动地移植数据,也就是说,数据库中的每一项记录将
对应表格的每一行,其中第一行包括来源于数据库字段名称的列标题。如果你不
想自动创建表格的第一行,那么可以利悠?
中,那么数据将一直保留在那儿,直到应用程序使用它们。有四种属性和一种方
法帮助你做到这一点:AddItem方法和Clip、Text、TextArray、TextMatrix属性


如果你象列表框那样使用表格,或是喜欢将表格当作一个列表框来考虑,那么你
使用AddItem方法来填充表格。以下代码将创建一个两列的表格,其中一列是从A
到Z的字母,另一列是它们对应的ASCII码。



MSFlexGrid1.Rows = 0
For I = Asc("A") To Asc("Z")
MyData = Chr$(I) & vbTab & I
MSFlexGrid1.AddItem MyData
Next



AddItem方法将添加26行到表格中。在开始进行该操作之前我们首先设置行属性为
零,这样完成的表格将总共只有26行。注意怎样使用嵌入标签符(vbTab)以使数
据与第二列分开。AddItem方法还有优化的索引参数,以使你能够增加行到特定的
位置。

Clip属性是一个相当有用的属性,它使你能够快速地从数据源中移植数据到表格
中,当然前提是该数据源与Clip属性兼容。RdoResultset就属于这样的数据源,
GetClipString则是对之进行操作的方法。以下代码将将获取Customs表格的前四
行,并将它们拷贝到你的表格的第五到第八行:


Dim rs As rdoResultset
Set rs = MyConnection.OpenResultset("Customers")
'select the target rang私慌菰柚梦闹担敲茨憔鸵柚肍illStyle属性
和Text属性。
以下代码将对表格的每一个数据元填充"X":

MSFlexGrid1.Row = 0
MSFlexGrid1.Col = 0
MSFlexGrid1.RowSel = MSFlexGrid1.Rows - 1
MSFlexGrid1.ColSel = MSFlexGrid1.Cols - 1
MSFlexGrid1.FillStyle = flexFillRepeat
MSFlexGrid1.Text = "X"

如果你既想利用Text属性载入数据,又不想让当前数据元发生改变,那么你应当
设置TextArray和TextMatrix属性。这些属性可以在不改变Row和Col属性的情况下
设置任意数据元的内容。TextMatrix用熟悉的行和列符号标明数据元,而
TextArr比在SQL中使用ORDER BY语句来得更加迅速。排
序选择允许你选用递增或递减的方法进行数值型排序或字符串型排序。如果需要
,字符串型排序能够被设置为忽视大小写。Sort属性指明将采用何种排序方法,
由于属性一旦被设置,排序行为就会发生,所以Sort属性还能够被当作一种方法
。你能够对多个列进行组合排序。



为了增加排序的灵活性,有两种技术可以被采用。对flexSortCustom设置Sort属
性将导致一个特别事件Custom的发生,并且每当表格进行排序的时候,都将发生
该事件。你能够利用Custom事件实现你所希望的任何类型的排序。第二种方法是
利用隐含的列,并让表格完成排序工作,这种方法的前提是假设你的数据库中有
一个返回Short Date类型数值的字段。无论是数值型排序还是字符串型排序都将
对该列进行正确地排序。为了利用上述的数值排序你需要增加一个额外的列到表
格并将它的宽度设置为零。以下将向你展示怎样将数据转换为数值类型并将之移
植到表格,同时利用它对表格中的列进行排序(假设数据字段是第2列):


Dim Ro As Integer
Dim SortCol As Integer
Dim SortDate As Double

'add a column to hold the sort key
MSFlexGrid1.Cols = MSFlexGrid1.Cols + 1
SortCol = MSFlexGrid1.Cols - 1生在标准的Textbox控件中,该控件精确地
与需要编辑的数据元联系在一起。


在此例子中,我们将为用户提供两种进入编辑模式的方法:通过双击某个数据元
进入编辑模式,或是简单地通过在当前的数据元中输入内容来开始编辑。以下是
实现这两种编辑方法的程序:


Private Sub MSFlexGrid1_DblClick()
GridEdit Asc(" ")
End Sub

Private Sub MSFlexGrid1_KeyPress(KeyAscii As Integer)
GridEdit KeyAscii
End Sub


在每一种情况下,我们都调用表格编辑子程序,并向它传递一个键值。在双击的
情况下,我们传递空字符作为标志。GridEdit程序初始化编辑框并对之进行定位:

Sub GridEdit(KeyAscii As Integer)
'use correct font
Text1.FontName = MSFlexGrid1.FontName
Text1.FontSize = MSFlexGrid1.FontSize
Select Case KeyAscii
Case 0 To Asc(" ")
Text1 = MSFlexGrid1
Text1.SelStart = 1000
Case Else
Text1 = Chr(KeyAs⒔獗曛糜谧址哪┪病H绻嗉J绞峭?
过按常用键进入的话,我们将忽视初始的数据元内容,并将输入的键值插入到编
辑框中。将编辑框定位到某一行可以通过Move方法来实现,此处我们使用了四行
,其目的是为了使本文的阅读更加容易。注意MSFlexGrid非常方便地向我们提供
了所有我们所需的相关信息。


接着,我们需要几个程序来处理内部事务,当用户在不同的数据元之间移动或从
其他控件移动焦点到表格时将发生这些事务。

Private Sub MSFlexGrid1_LeaveCell()
If Text1.Visible Then
MSFlexGrid1 = Text1
Text1.Visible = False
End If
End Sub

Private Sub MSFlexGrid1_GotFocus()
If Text1.Visible Then
MSFlexGrid1 = Text1
Text1.Visible = False
End If
End Sub

接着,我们将在编辑框的KeyDown事件中输入一些浏览代码,这样做的目的可以通
过例子来说明,用户能够通过按ESC离开编辑模式,并按箭头键移动到其他行:

Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
Case vbKeyEscape
Text1.Visible = False
MSFlexGrid1.SetFocus
Case vbKeyReturn
MSFlexGrid1.SetFocus
Case vbKeyDown
MSFlexGrid1.SetFocus
DoEvents
If MSFlexGrid1.Row < MSF须做到在点击表格的滚
动条后编辑框不会丧失焦点。


注意该技术并不仅仅限于对Textbox的编辑,你还能够通过改变上述例子程序的代
码,使之适用于ComboBox、CheckBox。该技术甚至还能够适用于日历控件的编辑
,当然这种编辑是基于列的。


MSFlexGrid是一种非常灵活的而且必不可少的控件,本文所述及的仅仅是部分内
容,你能够利用MSFlexGrid处理更多的事情。当你对MSFlexGrid渐渐熟悉以后,
它将变成你的工具箱中非常常用的一个控件。数据元合并和透视是MSFlexGrid的
两个更加独特的属性,它们将为MSFlexGrid控件带来更加强大的功能。




--

   好好学习,天天向上!!!!

※ 来源:·BBS 荔园晨风站 bbs.szu.edu.cn·[FROM: 192.168.11.111]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店