全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3023
推到 Plurk!
推到 Facebook!

關於DBGrid的排序問題

尚未結案
jimm
一般會員


發表:10
回覆:9
積分:3
註冊:2004-09-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-02 12:00:56 IP:219.84.xxx.xxx 未訂閱
我想請問一下,就是DBGrid如何做出排序的問題 就是在Grid的最上端那一排,按下某一個數值 就能以該欄作為排序的基準,按第一下可以由小到大的排序 再按一下又可以相反過來以大到小的排序 這樣子反覆的交換? 麻煩各位前輩,謝謝教導.....
SimonLee
一般會員


發表:15
回覆:23
積分:7
註冊:2003-09-20

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-02 12:06:50 IP:218.17.xxx.xxx 未訂閱
如果你是用ADO的話,可以用ADODataSet1.Sort := 'sortfieldname [DESC]'; sortfieldname - 可以在DBGrid的onTitleClick Event的Column.fieldname得知 [DESC] - 不寫是順序,DESC是倒序,用一個變量記住當時的Sort Order 發表人 - SimonLee 於 2004/11/02 12:09:06
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-02 12:20:50 IP:61.222.xxx.xxx 未訂閱
使用 ADOQuery 有 SORT 功能。 ADOQuery1.Sort := FieldName ' DESC' ADOQuery1.Sort := FieldName ' ASC';
jimm
一般會員


發表:10
回覆:9
積分:3
註冊:2004-09-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-11-02 12:21:12 IP:219.84.xxx.xxx 未訂閱
那如果有很多的Title....是否有比較簡易的方法可以完成此動作? 還是說就只有此種土法煉鋼的方法呢??
jimm
一般會員


發表:10
回覆:9
積分:3
註冊:2004-09-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-11-02 13:07:24 IP:219.84.xxx.xxx 未訂閱
由於我是個Delphi 的新手,目前尚未摸熟ADOQuery & SQL的語法 請問這個是需要在ADOQuery內下什麼SQL的語法嗎? 還是說只需要利用您所說的用法即可?
引言: 使用 ADOQuery 有 SORT 功能。 ADOQuery1.Sort := FieldName ' DESC' ADOQuery1.Sort := FieldName ' ASC';
SimonLee
一般會員


發表:15
回覆:23
積分:7
註冊:2003-09-20

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-11-02 14:17:16 IP:218.17.xxx.xxx 未訂閱
引言: 由於我是個Delphi 的新手,目前尚未摸熟ADOQuery & SQL的語法 請問這個是需要在ADOQuery內下什麼SQL的語法嗎? 還是說只需要利用您所說的用法即可?
引言: 使用 ADOQuery 有 SORT 功能。 ADOQuery1.Sort := FieldName ' DESC' ADOQuery1.Sort := FieldName ' ASC';
沒有甚麼特別的要求在SQL句字內
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-11-02 14:31:44 IP:202.62.xxx.xxx 未訂閱
引言: 由於我是個Delphi 的新手,目前尚未摸熟ADOQuery & SQL的語法 請問這個是需要在ADOQuery內下什麼SQL的語法嗎? 還是說只需要利用您所說的用法即可?
引言: 使用 ADOQuery 有 SORT 功能。 ADOQuery1.Sort := FieldName ' DESC' ADOQuery1.Sort := FieldName ' ASC';
您好﹗ 插個花﹒ 此用法非SQL語法﹐而是ADO資料集元件的屬性﹐所以無關系SQL﹐直接使用即可﹒ ========================= 我是您的朋友﹐有您真好﹗ =========================
------
忻晟
jimmygump
一般會員


發表:8
回覆:12
積分:4
註冊:2003-09-09

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-11-02 15:03:14 IP:61.71.xxx.xxx 未訂閱
我最近也在查類似的實作方法,的確用 Sort 屬性最快。 但我一直還是無法針對 fkData 以外的 FieldType 進行排序,例如:fkLookup 舉例: 在[會員資料表]裡有一個 Foreign Key 是 [最高學歷ID] 在 dataset 加一個 Lookup Field 為 [最高學歷名稱] DBGrid 裡顯示的是 [最高學歷名稱] 而不是 [最高學歷ID] 我還是無法針對這個 [最高學歷名稱] 排序。 雖然有人建議用 SQL 去 join 出來,然後又是 Close 再 Open 的...但都不是我要的方法。(我就是從記錄 ORDER BY 子句的架構,最後因為種種不符需求之下,不得不揚棄了,再回頭用改 Sort 屬性反而很方便) 有沒有人願意提供方法呢? .不要用改 Order By 子句,再 Close 又 Open 的方法 .而能針對 fkLookup, fkCalculated 欄位做 Grid 排序 Jimmy Gump
------
Jimmy Gump
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-11-02 15:31:23 IP:61.222.xxx.xxx 未訂閱
全貼出來好了! 先決條件,一定要使用 ADOQuery1。    點選,DBGRID 標題自動排序。 點一次,由小到大。再點一次,由大到小。    
type
  TForm1 = class(TForm)
    DBGrid1: TDBGrid;
    ...... 
    procedure FormCreate(Sender: TObject);
    procedure DBGrid1TitleClick(Column: TColumn);
    procedure DBGrid1ColumnMoved(Sender: TObject; FromIndex,
      ToIndex: Integer);
  private
    PCOLIndex : Integer;
    IsDESC    : Boolean;
  public
    { Public declarations }
  end;    var
  Form1: TForm1;    implementation    {$R *.DFM}    procedure TForm1.FormCreate(Sender: TObject);
begin
  IsDESC := false;
  PCOLIndex := -1;
end;    procedure TForm1.DBGrid1TitleClick(Column: TColumn);
begin
  with TCustomADODataSet(DBGrid1.DataSource.DataSet) do
  begin
    if IsEmpty or (Not Active) then Exit;        IsDESC := (PCOLIndex = Column.Index) and (Not IsDESC);
    PCOLIndex := Column.Index;        if IsDESC then Sort := Column.Field.FieldName   ' DESC'
              else Sort := Column.Field.FieldName   ' ASC';
  end;
end;    procedure TForm1.DBGrid1ColumnMoved(Sender: TObject; FromIndex,
  ToIndex: Integer);
begin
  if FromIndex = PCOLIndex then PCOLIndex := toIndex;
end;    end.
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-11-02 15:36:46 IP:61.218.xxx.xxx 未訂閱
參考這裡: http://delphi.ktop.com.tw/topic.php?topic_id=53002
jimmygump
一般會員


發表:8
回覆:12
積分:4
註冊:2003-09-09

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-11-02 17:32:09 IP:61.71.xxx.xxx 未訂閱
引言: 全貼出來好了! 先決條件,一定要使用 ADOQuery1。 點選,DBGRID 標題自動排序。 點一次,由小到大。再點一次,由大到小。
不知版主試過 fkLookup 嗎? 這樣的 code 應該只適合 fkData。 另外,在中國的 CSDN 論壇上看到有人是這樣的觀念來處理 fkLookup 的:
  if (Column.Field.FieldKind = fkData) then
    ......
  else if (Column.Field.FieldKind = fkLookup) then
    Sort := Column.Field.KeyFields;
不過我仍然覺得不妥,畢竟呈現出來的是 ResultFields,就應該以 ResultFields 來排序。怎麼能預期 KeyFields 和排序結果和 ResultFields 是一致的呢? 這個問題仍然無解中...
------
Jimmy Gump
系統時間:2024-07-01 9:38:48
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!