Vfp中Grid的使用技巧
1.如何在GRID里控制回車事件
在VFP里,GRID的默認控件都是TEXTBOX,形成了一個表格,但是在這個二維表里進行操作時,每次按回車都是往后一個單元格跳轉,當?shù)阶詈笠涣袝r,則繼續(xù)跳到第一列,進而循環(huán),操作很不方便。
1、對GRID所在的表單新增屬性:
cur_recn 記錄當前記錄號
cur_recc 記錄最大記錄號
2、在表單初始化,或給GRID以數(shù)據(jù)源時,就先計算出該表的最大的記錄數(shù),如下:
thisform.cur_recc=recc()
為了一次得到當前GRID里的表的記錄總數(shù)
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 "{dnarrow}" && 模擬鍵盤下箭頭,使記錄指針下移一個
endif
endif
以上所說的,只要按鍵盤上的上下箭頭即可輕易做到在GRID中移動指針,沒有太大的意義。
2.如何實現(xiàn)輸完數(shù)據(jù)后按回車鍵,使表格中的焦點自動跳到下一行
在你要判斷轉換的GRID的最后一列的TEXT1的keypress:
IF
以上代碼未經(jīng)過試驗,等待ing
Thisform.grid1.recordsuore=Null是什么意思?
Thisform.grid1.recordsuore=Null 與Thisform.grid1.recordsuore=''是不是一樣的?
null是不等于'',但在上面例子中的結果是一樣的。
NULL值不是空值,也不是零值,而是未知的、不可預測的值。在數(shù)據(jù)庫中,一旦將某字段設為Not Null 則用戶必須錄入數(shù)據(jù),否則不允許數(shù)據(jù)庫更新。
3.我怎樣才能把網(wǎng)格中的文本控件替換為其它控件?(可參照收費管理系統(tǒng))
首先,先把原來的文本框控件刪除。
1)在您要修改的網(wǎng)格上按下鼠標右鍵,選擇彈出菜單中的“屬性....”
2)在彈出的屬性對話框頂端的列舉框中選擇要替換文本框的column下的text1。
3)在網(wǎng)格上按一下鼠標左鍵。
4)按下鍵盤上的DELETE按鍵,刪除Text1控件(網(wǎng)格上的ab1將會消失)。
其次,在網(wǎng)格上添置控件。
1)在您要修改的網(wǎng)格上按下鼠標右鍵,選擇彈出菜單中的“編輯....”
2)按一下表單控件工具欄上您要加到網(wǎng)格上的控件。
3)在您要添置控件的column上按下鼠標左鍵,并放置控件。
用Grid模擬Browse窗口
可以將Grid結合在Form對象中,模擬成一個Browse命令窗口,當自由調整Form大小時,Grid對象也會自動調整大小。實現(xiàn)方法如下:
1.首先設定一個Form對象,該對象必須保留其BorderStyle屬性為“3-可調邊框”,即設為可自由調整大小的邊線屬性;同時設定Resize事件如下:
Thisform.Grid1.Width=this.Width
Thisform.Grid1.Height=this.Height
2.設計一個Grid對象于Form對象中,并設定其屬性如下:
RecordSource為目前“數(shù)據(jù)環(huán)境”中所設定的工作區(qū)別名;
Top與Left均設為0,表示該對象左上端坐標為(0,0);
Width的值設為Thisform.Width;
Height的值設為Thisform.Height。
這樣,已經(jīng)設定好的Grid對象便可以和Browse窗口相關聯(lián),當對Form對象進行大小調整時,Grid對象的高度與寬度就可以隨之調整了。
4.表格GIRD的數(shù)據(jù)源表刪除數(shù)據(jù)或變動后,表格會顯示空白?
thisform.grid1.RecordSource = null
SELECT yea,mon,jcgz1,gwgz1,ren1,jcgz2,gwgz2,ren2,dqgz,dqren,ntgz,ntren,txgz,txren;
thisform.grid1.RecordSource = 'dwgz'
其實就是:
先hsiform.grid1.recordsource = null
經(jīng)過表操作(刪除、變動等)
后hisform.grid1.recordsource ='dbfname'
5.關于Grid的綁定數(shù)據(jù)源問題(用臨時表綁定)
thisform.grid1.recordsource=""
SELECT 學號,姓名 FROM tblStudent INTO CURSOR temporary
具體解釋如下:
thisform.grid1.recordsource=""
這一行的目的是讓grid1在整個
SELECT 學號,姓名 FROM tblStudent INTO CURSOR temporary
期間不隨temporary表的變化而變化,INTO CURSOR temporary實際上有多個動作,
先清除原臨時表temporary,再生成新的temporary表,
thisform.grid1.recordsource=""這行的目的是讓GRID1在全過程中和臨時表temporary斷開,不受它的影響.
當全部操作完后再用
thisform.grid1.recordsource="temporary"
連接上去,最好在這句前加上一句,
select temporary
go top
這樣如果temporary有多條記錄的話不會出現(xiàn)指針在末尾而看不到第一條記錄的情況(不好看),
thisform.grid1.refresh()這句基本上可以不要的,在大多數(shù)情況下不會出錯,只有在查詢后緊跟其它對grid1數(shù)據(jù)集調用指令的會出錯.
6.grid控件的使用技巧(應用setall()方法統(tǒng)一設置)
(1)禁止用戶用鼠標去調整各個column的位置順序
在grid的init事件程序中輸入以下代碼:
this.setall("movable",.f.,"column")
(2)禁止用戶用鼠標去調整各個column的寬度
在grid的init事件程序中輸入以下代碼:
this.setall("rsizable",.f.,"column")
(3)使grid中各個column的標題文字自動居中
在grid的init事件程序中輸入以下代碼:
this.setall("alignment",2,"header")
(4)建立求平均欄
假設一個存放了成績數(shù)據(jù)表(包括:姓名、語文、數(shù)學、政治字段),欲在grid中增加一個“平均分”直欄,只需將grid的columncount屬性加1,然后將“平均分”欄的controlsource屬性設為如下:
controlsource=(語文+數(shù)學+政治)/3
(5)根據(jù)用戶選定的column進行排序
有時希望單擊column的標題,就以此column的字段進行排序顯示記錄。我們可以在各個column的header對象的click事件中,將數(shù)據(jù)環(huán)境中的cursor對象的order屬性設定成根據(jù)這個column的字段建立的索引名稱,然后再調用grid的refresh方法即可。例如:
thisform.dataenvironmnet.cursor1.order="姓名"
thisform.grid1.refresh
(6) Grid對象中焦點行的動態(tài)顯示
Grid對象中當數(shù)據(jù)記錄移動時,用顏色動態(tài)變化顯示相對光標所在記錄的位置,可以在Grid對象的afterRowColChange事件過程中加入如下內(nèi)容:
this.setall(“dynamicbackcolor”,“iif(this.activerow=recno(),rgb(0,0,255),rgb(255,255,255))”,“column”)。
(7)在網(wǎng)格中交替顯示顏色
記錄號有序排列時,可以在網(wǎng)格的列中交替顯示白色和灰色的記錄,代碼如下:
thisform.Grid1.SetAll("DynamicBackColor","IIF(MOD(RECNO(),2)=0,RGB(255,255,255),RGB(192,192,192))","Column")&&交替顯示白色和綠色的記錄
(8) 符合條件的記錄顯示顏色
進行查詢時,想在網(wǎng)格中動態(tài)地顯示符合條件的記錄的顏色,可以充分利用DynamicBackColor和DynamicForeColor特性。下例將符合條件的記錄的字體變?yōu)榧t色Thisform.Grid1.Column1.DynamicForeColor="IIf(Database.Category_ID='A02',RGB(225,0,0),RGB(0,0,124))"
例如:在《宅基地管理系統(tǒng)》中,使被注、撤銷的記錄呈現(xiàn)紅色,可在grid1的init事件和afterrowcolchange中添加下列代碼:(注意:經(jīng)過實驗,加不加"column"都可以)
thisform.Grid1.SetAll("DynamicforeColor","IIF(是否被注(撤)銷='是',rgb(255,0,0),rgb(0,0,0))") &&使被注撤銷的記錄顯紅色
(9)設置多種顏色(無規(guī)律性)
主要是針對一個表GRID里,當記錄很多時,而且某些記錄具有特定的屬性時,我們需要設置顏色來區(qū)分這些數(shù)據(jù),如下代碼可以在刷新或初始化表單時,設置其屬性。(注意:經(jīng)過實驗,加不加,"column"都可以)
thisform.Grid1.SetAll("DynamicBackColor","IIF(type>=1,iif(type>=2,iif(type>=3,rgb(0,128,0),rgb(192,192,192)),rgb(255,0,0)),rgb(255,255,255))")
如上代碼可以說明,如果某記錄中有一個字段type,那么根據(jù)這個字段的數(shù)據(jù)值,可以顯示不同顏色,可以轉換成如下公式:
iif(條件1,iif(條件2,iif(條件3,iif(條件4,iif(條件5,[...iif(條件N,顏色N,顏色n-1)...,]顏色5,顏色4),顏色3),顏色2),顏色1),其他顏色)
(10)用SetAll方法。例如,你決定為全部網(wǎng)格中的標題設置9號宋體。將以下代碼放入網(wǎng)格的Init事件: THIS.SETALL("FontName","Arial","Header")
7..怎么才能讓grid的光標自動移動到要編輯記錄上?
如grid顯示的表為aa
aa記錄有:
學號
001
002
003
。。。。。。
240
。。。。。。
在表單textbox中輸入"240"后,讓光標自動到學號為“240”的記錄(且grid能夠自動滾動到此記錄顯示-------)
在cmdGo的click事件中,用以下代碼:
sele aa
loca 學號=thisform.textbox.value
thisform.grid.setfocus
8、我怎樣才能把網(wǎng)格中的文本控件替換為其它控件?
答:首先,先把原來的文本框控件刪除。
1:在您要修改的網(wǎng)格上按下鼠標右鍵,選擇彈出菜單中的“屬性....”
2:在彈出的屬性對話框頂端的列舉框中選擇要替換文本框的column下的text1。
3:在網(wǎng)格上按一下鼠標左鍵。
4:按下鍵盤上的DELETE按鍵,刪除Text1控件(網(wǎng)格上的ab1將會消失)。
其次,在網(wǎng)格上添置控件。
1:在您要修改的網(wǎng)格上按下鼠標右鍵,選擇彈出菜單中的“編輯....”
2:按一下表單控件工具欄上您要加到網(wǎng)格上的控件。
3:在您要添置控件的column上按下鼠標左鍵,并放置控件。