用ClientDataSet和dbgrid 如何通过点击dbgrid的标题进行排序

解决方案 »

  1.   

    用DbgridEh很方便,基本上是0代码实现
      

  2.   

    查ClientDataSet帮助AddIndex的使用
      

  3.   

    在Form里添加两个public变量
        Fdns,descs:string;编写DBGrid的OnTitleClick事件
    procedure TForm1.GridOnTitleClick(Column: TColumn);
    var fdn,disp,flag,ins1:string;
    function GetIndexName:string;
    var s1:string;
    begin
      s1:='I'+DateTimeToStr(Now)+IntToStr(Random(999));
      s1:=AnsiReplaceText(s1,' ','');
      s1:=AnsiReplaceText(s1,'_','');
      s1:=AnsiReplaceText(s1,':','');
      Result:=s1;
    end;
    begin
     { if Column.Index>ClientDataSet1.Fields.Count-1 then
      begin
        showmessage('不成'+IntToStr(Column.Index)+','+IntToStr(ClientDataSet1.Fields.Count));
        exit;
      end; }
      if not DBGrid1.DataSource.DataSet.Active then
      begin
        ShowMessage('没有打开'+DBGrid1.DataSource.DataSet.Name);
        exit;
      end;
      if DBGrid1.DataSource.DataSet.RecordCount=0 then exit;
      if ClientDataSet1.IndexDefs.Count>0 then  fdns:=ClientDataSet1.IndexDefs.Items[ClientDataSet1.IndexDefs.Count-1].Fields;
      if ClientDataSet1.IndexDefs.Count>0 then  descs:=ClientDataSet1.IndexDefs.Items[ClientDataSet1.IndexDefs.Count-1].DescFields;
      fdn:=ClientDataSet1.Fields[Column.Index].FieldName;
      disp:=ClientDataSet1.Fields[Column.Index].DisplayLabel;
      if pos('↓',disp)>0 then
      begin
        flag:='↑';//如果正续排列
        if pos(fdn,fdns)=0 then fdns:=fdns+';'+fdn;//如果没有正序,则添加
        if pos(fdn,descs)=0 then descs:=descs+';'+fdn;//增加反序  end
      else if pos('↑',disp)>0 then
      begin
       flag:='';//如果无序
       fdns:=AnsiReplaceText(fdns,fdn,'');
       descs:=AnsiReplaceText(descs,fdn,'');
      end
      else
      begin
        flag:='↓';//如果反序
        if pos(fdn,fdns)=0 then fdns:=fdns+';'+fdn;//增加索引
        if pos(fdn,descs)=0 then descs:=AnsiReplaceText(descs,fdn,'');//去除反续
      end;
      fdns:=AnsiReplaceText(fdns,' ','');
      while pos(';;',fdns)>0 do fdns:=AnsiReplaceText(fdns,';;',';');
      if copy(fdns,1,1)=';' then delete(fdns,1,1);
      if copy(fdns,length(fdns),1)=';' then delete(fdns,length(fdns),1);
      descs:=AnsiReplaceText(descs,' ','');
      while pos(';;',descs)>0 do descs:=AnsiReplaceText(descs,';',';');
      if copy(descs,1,1)=';' then delete(descs,1,1);
      if copy(descs,length(descs),1)=';' then delete(descs,length(descs),1);
      disp:=flag+fdn;  ClientDataSet1.DisableControls;
      ins1:=GetIndexName;
      while  ClientDataSet1.IndexDefs.Count>0  do  ClientDataSet1.DeleteIndex(ClientDataSet1.IndexDefs.Items[0].Name);
      ClientDataSet1.IndexName:='';
      ClientDataSet1.AddIndex(ins1,fdns,[ixCaseInsensitive],descs,'',0);  ClientDataSet1.IndexName:=ins1;
      ClientDataSet1.Fields[Column.Index].DisplayLabel:=flag+fdn;
      ClientDataSet1.First;
      ClientDataSet1.EnableControls;
    end;