天气:
心情:
為Grid增添一個新的功能:按Cloumn列排序!
説明一下,運用這個功能要使用到VFP8及後續版本中的動態事件綁定的功能!並有可能還要使用到CA類,所以對於還在使用VFP6的朋友就稍微有點不適,但該方法依舊可以使用,只是在代碼的編寫上複雜了許多,我不會對VFP6使用該功能作講述,希望你們自己去摸索,要么。。。就趕快升級你的VFP吧!
該步驟我是依照具體使用方法一步一步來的,如果你一邊對照設計就應該不會錯了!
第一步:肯定是建立一個表單,並添加好Grid控件了(这里定义Gird的Name为Gird1)!
在設計環境下,一般就指定好了Gird的數據源,並對一些事件、方法和屬性進行了定義和設置,但由於也考慮到有些狐友是在運行中動態改變Gird的數據源,為此,要實現我所說的這個功能還不能一概而論!但實現的原理還是一樣的。
第二步:事件和方法的定義!
因爲要將Gird的Column.Header.Click事件作動態邦定,爲此你就必須為這個動態的事件預先寫好處理的方法。
在Form中添加三個方法:Form.BindColumnEvent 、 Form.ColumnIndex 和 Form.GetFieldTag(當然這些方法的名字可由你自己決定了)
Form.BindColumnEvent方法代碼如下:
*--方法開始
=UNBINDEVENTS(This) &&撤銷與Form.ColumnIndex的所有綁定
FOR EACH oControl IN thisform.Gird1.Columns
BINDEVENT(oControl.Controls(1),\'Click\',thisform,\'ColumnIndex\')
ENDFOR
*方法説明:用For Each的方法遍歷Gird1种所有的Column,并將Form.ColumnIndex方法綁定至Gird.Column.Header.Click事件
*--方法結束
Form.ColumnIndex方法代碼如下:
*--方法開始
LOCAL ARRAY laEvents[1]
AEVENTS(laEvents,0) &&用Aevents函數取囘呼叫這個事件的對象(也就是判斷到底是哪個Column的Header被點擊了)
a=laEvents[1,1].Parent.ControlSource &&這裡的“a”所取得的就是該Column所對應的數據源的字段名
Ftag=This.GetFieldTag(a) &&調用Form.GetFieldTag方法判斷該字段是否已經建立了索引
a=SUBSTR(a,AT(\'.\',a)+1)
IF EMPTY(Ftag) &&判斷,如果以索引過,就只將該索引設置為主索引,否則就再建立一個該Column對應字段的索引
INDEX ON &a TAG &a
ELSE
SET ORDER TO (Ftag)
ENDIF
thisform.grid1.Refresh
*--方法結束
Form.GetFieldTag方法代碼如下:
*--方法開始
Lparameter tcField
Local lcKey,lcTag,lnI,lnPos,lcAlias, lcField,lnTags
lnPos = At(\'.\', tcField)
lcAlias = Upper(Left(tcField, lnPos - 1))
lcAlias = Iif(Empty(lcAlias), Alias(), lcAlias)
lcField = Upper(Substr(tcField,lnPos+1))
lcTag = \'\'
If Used(lcAlias)
lnTags = Tagcount(\'\', lcAlias)
For lnI = 1 To lnTags
lcKey=Key(\'\',lnI,lcAlias)
IF UPPER(ALLTRIM(lcKey))=UPPER(ALLTRIM(lcField))
lcTag=Upper(Tag(\'\', lnI, lcAlias))
EXIT
ENDIF
ENDFOR
Endif
Return lcTag
*方法説明:該方法是取自Mihu給我的一個自定義函數,我將其精簡化了,執行的結果是返回所指定字段的索引名,如果沒有索引就返回空字串
*--方法結束
第三步:在Form中添加代碼
如果說你是在設計的時候就定義好了Gird的數據源,並進行了相關的設置,那麽你只需要在Form的Init事件中加上一句:This.BindColumnEvent就可以了!
如果你是動態改變Gird數據源的話,那麽就需在你改變數據源后加上這句:Thisform.BindColumnEvent,那麽它將會為你重新綁定所有Gird.Column.Header.Click事件。
至此,所有的工作基本上都做完了,只等你去試一試了!但有一點我卻需要説明,如果Gird的數據源是本地的數據表,而你在運行的過程中測試了所有Column的排序,那麽等你退出后,你這個原本不打算建立索引的數據表,所有的字段都被建立索引了!!!
如果Gird綁定的是一個Cursor,那麽沒關係,不會有任何的副作用,所建立的索引在Cursor關閉后全部都會被清理掉,一點垃圾也不剩!
如果Gird綁定的是一個CA類數據源,那麽這個CA的緩衝模式不能設置為TableBuffering,而只能用行緩衝模式。同樣的,在CA釋放后,所建立的索引也會一並消失!
好了,儸嗦了這麽久,耽誤大家時間了,趕快動手試一試!
感謝:Mihu、龍飛九天提供了相關的幫助!