2008/05/07 | 為Grid增添一個新的功能:按Cloumn列排序!
类别(数据库学习笔记) | 评论(0) | 阅读(391) | 发表于 23:06

天气:心情:

為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、龍飛九天提供了相關的幫助!

0

评论Comments