Access 点击DbGrid列标题,排序

解决方案 »

  1.   

    1.Three component  e.g:dbgrideh of ehlib
    2.instead of ListView
    3.find forward question
      

  2.   

    用GRIDEH吧!!直接设置属性就可以啦!
      

  3.   

    简单的不考虑其他环境的做法:
    再dbgrid.ontitleclick事件里写东西
     with dbgrid1.datasource.dataset do
     begin
       indexfieldnames:=Column.FieldName;
     end;
    这个要求dbgrid关联的是Ttable/ADO控件/TClientDataSet控件
      

  4.   

    转贴,其实像这样的帖子真的是已经很多了,楼主自己以后可以找找,
    谁也不乐意总是回答自己见过的那几个问题,对吧?
    给你一段基于C/S三层结构中的这段代码:通用过程
     //=====================================================================
    procedure TfmAgentManager.GridTitleSort(Column: TColumn);
    var s,cFieldName:string;
        i:integer;
        DataSet:TDataSet;
        procedure setTitle;
        var ii:integer;
            cStr:string;
            c:TColumn;
        begin
          for ii:=0 to TDBGrid(Column.Grid).Columns.Count-1 do
          begin
            c:=TDBGrid(Column.Grid).Columns[ii];
            cStr:=c.Title.Caption;
            if (pos('▲',cStr)=1) or (pos('▼',cStr)=1) then
             begin
             Delete(cStr,1,2);
             c.Title.Caption:=cStr;
             end;
          end;    end;
    begin
      setTitle;
      DataSet:=Column.Grid.DataSource.DataSet;
      if Column.Field.FieldKind=fkLookup then
        cFieldName:=Column.Field.KeyFields
      else if Column.Field.FieldKind=fkCalculated then
        cFieldName:=Column.Field.KeyFields
      else
        cFieldName:=Column.FieldName;
     //=================================AdoDataSet=====================  if DataSet is TCustomADODataSet then begin
        s:=TCustomADODataSet(DataSet).Sort;
        if s='' then begin
          s:=cFieldName;
          Column.Title.Caption:='▲'+Column.Title.Caption;
        end
        else begin
          if Pos(cFieldName,s)<>0 then begin
            i:=Pos('DESC',s);
            if i<=0 then begin
              s:=s+' DESC';
              Column.Title.Caption:='▼'+Column.Title.Caption;
            end
            else begin
              Column.Title.Caption:='▲'+Column.Title.Caption;
              Delete(s,i,4);
            end;
          end
          else begin
            s:=cFieldName;
            Column.Title.Caption:='▲'+Column.Title.Caption;
          end;
        end;
        TCustomADODataSet(DataSet).Sort:=s;
      end
    //============================Clientdataset==========================
      else if DataSet is TClientDataSet then begin
        if TClientDataSet(DataSet).indexfieldnames<>'' then
        begin
          i:=TClientDataSet(DataSet).IndexDefs.IndexOf('i'+Column.FieldName);
          if i=-1 then
          begin
            with TClientDataSet(DataSet).IndexDefs.AddIndexDef do
            begin
              Name:='i'+Column.FieldName;
              Fields:=Column.FieldName;
              DescFields:=Column.FieldName;
            end;
          end;
          TClientDataSet(DataSet).IndexFieldNames:='';
          TClientDataSet(DataSet).IndexName:='i'+Column.FieldName;
          Column.Title.Caption:='▼'+Column.Title.Caption;
        end
        else
        begin
          TClientDataSet(DataSet).IndexName:='';
          TClientDataSet(DataSet).IndexFieldNames:=column.fieldname;
          Column.Title.Caption:='▲'+Column.Title.Caption;
        end;
      end;
    end;
    //======================================================================
    procedure TfmAgentManager.DBGrid1TitleClick(Column: TColumn);
    begin
    GridTitleSort(column);
    end;