VFP中GRID的使用技巧 下载本文

内容发布更新时间 : 2024/5/4 14:51:55星期一 下面是文章的全部内容请认真阅读。

GRID的使用技巧

1.如何在GRID里控制回车事件

在VFP里,GRID的默认控件都是TEXTBOX,形成了一个表格,但是在这个二维表里进行操作时,每次按回车都是往后一个单元格跳转,当到最后一列时,则继续跳到第一列,进而循环,操作很不方便。

下面说明如何在GRID里的一个列里按回车使记录连续往下跳转(或可以执行其他的操作),当跳转到最后一行时执行另一个操作。 1、对GRID所在的表单新增属性: cur_recn 记录当前记录号 cur_recc 记录最大记录号

2、在表单初始化,或给GRID以数据源时,就先计算出该表的最大的记录数,如下: thisform.cur_recc=recc()

为了一次得到当前GRID里的表的记录总数 3、在GRID的AfterRowColChange事件里写: thisform.cur_recn=recn()

为了得到当前的GRID里的表的记录号

4、在GRID里的某列的TEXT1的KEYPRESS事件里: if nKeyCode = 13 && 当按键为回车时 if thisform.cur_recn>=thisform.cur_recc

**-- 当当前记录大于等于最大记录时,即记录已到最后一个时 thisform.command1.setfocus

**-- 使表单上的一个命令按纽聚焦,也即可以跳出该GRID,

**-- 而正常的操作很难从GRID里跳出,在这里就可以使在记录到最后时焦点跳出来 else

thisform.cur_recn=recn() && 当记录还没到尾时,则... nodefault && 不做任何响应

keyboard \模拟键盘下箭头,使记录指针下移一个 endif endif

以上所说的,只要按键盘上的上下箭头即可轻易做到在GRID中移动指针,没有太大的意义。 2.如何实现输完数据后按回车键,使表格中的焦点自动跳到下一行 在你要判断转换的GRID的最后一列的TEXT1的keypress: IF nKeyCode=13

SELECT 你绑定表名 nRec=RECNO() SKIP IF EOF()

APPEND BLANK &&在表尾加一空记录 SKIP &&记录指针到EOF() Thisform.grid1.refresh

Thisform.grid1.column1.text1.SetFocus &&到最前面 ELSE

GO nRec &&同一行,不要此就跳下一格

Thisform.grid1.refresh

Thisform.grid1.column1.text1.SetFocus ENDIF ENDIF

以上代码未经过试验,等待ing

Thisform.grid1.recordsuore=Null是什么意思?

Thisform.grid1.recordsuore=Null 与Thisform.grid1.recordsuore=''是不是一样的? null是不等于'',但在上面例子中的结果是一样的。

NULL值不是空值,也不是零值,而是未知的、不可预测的值。在数据库中,一旦将某字段设为Not Null 则用户必须录入数据,否则不允许数据库更新。

3.我怎样才能把网格中的文本控件替换为其它控件?(可参照收费管理系统) 首先,先把原来的文本框控件删除。

1)在您要修改的网格上按下鼠标右键,选择弹出菜单中的“属性....”

2)在弹出的属性对话框顶端的列举框中选择要替换文本框的column下的text1。 3)在网格上按一下鼠标左键。

4)按下键盘上的DELETE按键,删除Text1控件(网格上的ab1将会消失)。 其次,在网格上添置控件。

1)在您要修改的网格上按下鼠标右键,选择弹出菜单中的“编辑....” 2)按一下表单控件工具栏上您要加到网格上的控件。

3)在您要添置控件的column上按下鼠标左键,并放置控件。 用Grid模拟Browse窗口

可以将Grid结合在Form对象中,模拟成一个Browse命令窗口,当自由调整Form大小时,Grid对象也会自动调整大小。实现方法如下:

1.首先设定一个Form对象,该对象必须保留其BorderStyle属性为“3-可调边框”,即设为可自由调整大小的边线属性;同时设定Resize事件如下: Thisform.Grid1.Width=this.Width Thisform.Grid1.Height=this.Height

2.设计一个Grid对象于Form对象中,并设定其属性如下: RecordSource为目前“数据环境”中所设定的工作区别名; Top与Left均设为0,表示该对象左上端坐标为(0,0); Width的值设为Thisform.Width; Height的值设为Thisform.Height。

这样,已经设定好的Grid对象便可以和Browse窗口相关联,当对Form对象进行大小调整时,Grid对象的高度与宽度就可以随之调整了。

4.表格GIRD的数据源表删除数据或变动后,表格会显示空白? thisform.grid1.RecordSource = null

SELECT yea,mon,jcgz1,gwgz1,ren1,jcgz2,gwgz2,ren2,dqgz,dqren,ntgz,ntren,txgz,txren; FROM gzhz WHERE danwei = this.value AND yea = thisform.cboyea.Value ; INTO dbf dwgz ORDER BY mon thisform.grid1.RecordSource = 'dwgz' 其实就是:

先hsiform.grid1.recordsource = null 经过表操作(删除、变动等)

后hisform.grid1.recordsource ='dbfname'

5.关于Grid的绑定数据源问题(用临时表绑定) thisform.grid1.recordsource=\

SELECT 学号,姓名 FROM tblStudent INTO CURSOR temporary thisform.grid1.recordsource=\ thisform.grid1.refresh() 具体解释如下:

thisform.grid1.recordsource=\这一行的目的是让grid1在整个

SELECT 学号,姓名 FROM tblStudent INTO CURSOR temporary

期间不随temporary表的变化而变化,INTO CURSOR temporary实际上有多个动作, 先清除原临时表temporary,再生成新的temporary表,

thisform.grid1.recordsource=\这行的目的是让GRID1在全过程中和临时表temporary断开,不受它的影响.

当全部操作完后再用

thisform.grid1.recordsource=\连接上去,最好在这句前加上一句, select temporary go top

这样如果temporary有多条记录的话不会出现指针在末尾而看不到第一条记录的情况(不好看),

thisform.grid1.refresh()这句基本上可以不要的,在大多数情况下不会出错,只有在查询后紧跟其它对grid1数据集调用指令的会出错.

6.grid控件的使用技巧(应用setall()方法统一设置) (1)禁止用户用鼠标去调整各个column的位置顺序 在grid的init事件程序中输入以下代码: this.setall(\

(2)禁止用户用鼠标去调整各个column的宽度 在grid的init事件程序中输入以下代码: this.setall(\

(3)使grid中各个column的标题文字自动居中 在grid的init事件程序中输入以下代码: this.setall(\ (4)建立求平均栏

假设一个存放了成绩数据表(包括:姓名、语文、数学、政治字段),欲在grid中增加一个“平均分”直栏,只需将grid的columncount属性加1,然后将“平均分”栏的controlsource属性设为如下:

controlsource=(语文+数学+政治)/3 (5)根据用户选定的column进行排序

有时希望单击column的标题,就以此column的字段进行排序显示记录。我们可以在各个column的header对象的click事件中,将数据环境中的cursor对象的order属性设定成根据这个column的字段建立的索引名称,然后再调用grid的refresh方法即可。例如: thisform.dataenvironmnet.cursor1.order=\姓名\ thisform.grid1.refresh

(6) Grid对象中焦点行的动态显示

Grid对象中当数据记录移动时,用颜色动态变化显示相对光标所在记录的位置,可以在Grid对象的afterRowColChange事件过程中加入如下内容:

this.setall(“dynamicbackcolor”,“iif(this.activerow=recno(),rgb(0,0,255),rgb(255,255,255))”,“column”)。

(7)在网格中交替显示颜色

记录号有序排列时,可以在网格的列中交替显示白色和灰色的记录,代码如下: THIS.SETALL(\50,253))\设置隔行的不同背景颜色:。 (8) 符合条件的记录显示颜色

进行查询时,想在网格中动态地显示符合条件的记录的颜色,可以充分利用DynamicBackColor和DynamicForeColor特性。

例如:在《宅基地管理系统》中,使被注、撤销的记录呈现红色,可在grid1的init事件和afterrowcolchange中添加下列代码:(注意:加不加,\都可以)

this.SetAll(\是否被注(撤)销='是',rgb(255,0,0),rgb(0,0,0))\使被注撤销的记录显红色 (9)设置多种颜色(无规律性)

例如:在《宅基地管理系统》中,使被注、撤销的记录呈现红色,可在grid1的init事件和afterrowcolchange中添加下列代码:(注意:加不加,\都可以)

this.SetAll(\是否被注(撤)销='是',rgb(255,0,0),rgb(0,0,0))\使被注撤销的记录显红色

主要是针对一个表GRID里,当记录很多时,而且某些记录具有特定的属性时,我们需要设置颜色来区分这些数据,如下代码可以在刷新或初始化表单时,设置其属性。

thisform.Grid1.SetAll(\b(192,192,192)),rgb(255,0,0)),rgb(255,255,255))\

如上代码可以说明,如果某记录中有一个字段type,那么根据这个字段的数据值,可以显示不同颜色,可以转换成如下公式:

iif(条件1,iif(条件2,iif(条件3,iif(条件4,iif(条件5,[...iif(条件N,颜色N,颜色n-1)...,]颜色5,颜色4),颜色3),颜色2),颜色1),其他颜色)

(10)用SetAll方法。例如,你决定为全部网格中的标题设置9号宋体。将以下代码放入网格的Init事件: THIS.SETALL(\(11)其他(在《土地抵押管理系统》中使用的)

this.setall(\改变grid列头的前景色

this.setall(\改变grid列头的背景色

this.setall(\ &&使grid中各个column的标题文字自动居中 this.setall(\ &&使grid中各个column内的文字自动居中 this.setall(\禁止用户用鼠标去调整各个column的宽度

this.setall(\ &&禁止用户用鼠标去调整各个column的位置顺序 7..怎么才能让grid的光标自动移动到要编辑记录上? 如grid显示的表为aa aa记录有:

学号 姓名 001 王一 002 王二 003 王三

。。。。。。

240 王动 。。。。。。

在表单textbox中输入\后,让光标自动到学号为“240”的记录(且grid能够自动滚动到此记录显示-------)

在cmdGo的click事件中,用以下代码: sele aa

loca 学号=thisform.textbox.value thisform.grid.setfocus

8、我怎样才能把网格中的文本控件替换为其它控件? 答:首先,先把原来的文本框控件删除。

1:在您要修改的网格上按下鼠标右键,选择弹出菜单中的“属性....”

2:在弹出的属性对话框顶端的列举框中选择要替换文本框的column下的text1。 3:在网格上按一下鼠标左键。

4:按下键盘上的DELETE按键,删除Text1控件(网格上的ab1将会消失)。 其次,在网格上添置控件。

1:在您要修改的网格上按下鼠标右键,选择弹出菜单中的“编辑....” 2:按一下表单控件工具栏上您要加到网格上的控件。

3:在您要添置控件的column上按下鼠标左键,并放置控件。 9.如何在表格控件中用颜色区分特定的记录?

在GRID表格里不同的条件可以用不同颜色的背景或字体来分开吗?回答是肯定的。那么如何实现呢?

在VFP里有几个有关表格的属性:

Column.DynamicBackColor[ = cExpression] Column.DynamicForeColor[ = cExpression]

它们是用来改变表格控件中某个单元格背景和前景的色彩。另外还有两个相关属性: Grid.SetAll(\值\ Grid.SetAll(\值\它们是用来改变整个表格的背景和前景颜色的,可用它们来对颜色进行表格初始化。下面的示例很简单,就是对一个表格中年龄大于30岁的记录用红色加以标记。

对表单FORM1的Activate事件编程如下: