想要实现的功能是用户点击dbgrid的某一项,实现按该项表示的属性排序的功能
关键的问题是,如何得到鼠标指向的该列表示的属性名?

解决方案 »

  1.   

    用DBGridEh吧,在其列的上方会有一个排序的三角型另外,对于dbgrid的排序,事实上就是对数据集的排序ADO的,可以直接使用其Sort方法对于ClientDataSet,可以用AddIndex的方法来实现
      

  2.   

    var
      WXK_Form: TWXK_Form;
      bSort: Boolean = False;procedure TWXK_Form.DBGridEh1TitleClick(Column: TColumnEh);
    var
        i: integer;
        fieldname: string;
    begin
       //排序
       i := Column.Index;
       if bSort then
       begin
          fieldname := DBGridEh1.Columns[i].FieldName + ' ASC';
          bSort := False;
       end
       else
       begin
          fieldname := DBGridEh1.Columns[i].FieldName + ' DESC';
          bSort := True;
       end;   DM.WareHouse_ADOQuery.Sort := fieldname;
    end;
      

  3.   

    DBGrid就可以实现这样的功能啊 。var MouseDown:Integer;//标记排序的方式为正序或倒序
    在DBGrid的OnTitleClick事件中添加以下代码,其中AdoQuery1为DBGrid的Dataset
       mousedown := mousedown + 1;
       if  ADOQuery1.IsEmpty then abort;
       if mousedown mod 2 = 1 then
          ADOQuery1.Sort := column.FieldName
       else
          ADOQuery1.Sort := column.FieldName + '   ' + 'DESC';
      

  4.   

    对。还有就是要注意大小写。我刚试了。一直报错,最后才发现原来是区分大小写的。必须写成ASC和DESC
      

  5.   

    procedure TAboutmm.DBGrid1TitleClick(Column: TColumn);
    var
    i:integer;
    begin
    if dm.gz.FieldByName(Column.FieldName).FieldKind =fkData then
    begin
    for i:=0 to DBGrid1.Columns.Count-1 do
    begin
    if DBGrid1.Columns[i]<>Column then
    begin
    if (copy(DBGrid1.Columns[i].Title.Caption,1,2)='▲') or (copy(DBGrid1.Columns[i].Title.Caption,1,2)='▼') then
    DBGrid1.Columns[i].Title.Caption:=copy(DBGrid1.Columns[i].Title.Caption,3,length(DBGrid1.Columns[i].Title.Caption));
    end else
    begin
    if copy(Column.Title.Caption,1,2)='▲' then
    begin
    dm.gz.Sort:=Column.FieldName+' DESC';
    Column.Title.Caption:='▼'+copy(Column.Title.Caption,3,length(DBGrid1.Columns[i].Title.Caption));
    end else
    begin
    dm.gz.Sort:=Column.FieldName+' ASC';
    if copy(Column.Title.Caption,1,2)='▼' then
    Column.Title.Caption:='▲'+copy(Column.Title.Caption,3,length(DBGrid1.Columns[i].Title.Caption))
    else Column.Title.Caption:='▲'+Column.Title.Caption;
    end;
    end;
    end;
    end;
    end;
      

  6.   

    function FindColumn(Grid:TDbGrid;Name:string):TColumn;
    var
      i:integer;
    begin
      Result:=nil;
      for i:=0 to Grid.Columns.Count-1 do
        if Grid.Columns.Items[i].FieldName=Name then
          Result:=Grid.Columns.Items[i];
    end;
    procedure TOneDBForm.dbgCEATitleClick(Column: TColumn);
    var
      DataSet:TClientDataSet;
      ASC:boolean;
      Clm:TColumn;
    begin
      DataSet:=TClientDataSet(Column.Field.DataSet);
      if Assigned(DataSet) and DataSet.Active then
      begin
        ASC:=(StrPos(PChar(Column.Title.Caption),'▼')<>nil)
             and (DataSet.IndexName=Column.Fieldname);
        Clm:=FindColumn(TDbGrid(Column.Grid),DataSet.IndexName);
        if Assigned(Clm) then
        begin
          DataSet.DeleteIndex(DataSet.IndexName);
          Clm.Title.Caption:=Copy(Clm.Title.Caption,1,Length(Clm.Title.Caption)-2);
        end;
        if Asc then
        begin
          DataSet.AddIndex(Column.Fieldname,Column.FieldName,[ixDescending]);
          Column.Title.Caption:=Column.Title.Caption+'▲';
        end
        else begin
          DataSet.AddIndex(Column.Fieldname,Column.FieldName,[]);
          Column.Title.Caption:=Column.Title.Caption+'▼';
        end;
        DataSet.IndexName:=Column.Fieldname;
      end;
    end;
    procedure TOneDBForm.cdsCEABeforeClose(DataSet: TDataSet);
    var
      Column:TColumn;
    begin
      DataSet:=TClientDataSet(dbgcea.DataSource.DataSet);
      if Assigned(DataSet) then
      begin
        Column:=FindColumn(dbgcea,cdscea.IndexName);
        if Assigned(Column) then
        begin
          cdscea.DeleteIndex(cdscea.IndexName);
          Column.Title.Caption:=Copy(Column.Title.Caption,1,
                                     Length(Column.Title.Caption)-2);
        end;
      end;
    end;
      

  7.   

    第一次回复是ado的排序。
    的二次回复是ClientDataSet的排序。
      

  8.   

    多谢各位的热心答复,我自己做了一个函数实现如下:
    {自定义的用于排序的函数}
    function GetSortMode1:string;
    var tempstr,sortstr,initstr :string;
    begin
         //获取排序字符串,“字段 排序常数”
         sortstr := invoicequiry.ADOQuery1.Sort;
         //利用空格获取排序常数
         tempstr := copy(sortstr,pos(' ',sortstr),255);     //uppercase转化成大写字母方便比较
         if (uppercase(trim(tempstr)) = 'ASC') then
         begin
              tempstr := 'DESC';
         end
         else
         begin
              tempstr := 'ASC';
         end;
         result := tempstr;
    end;然后再ontitleclick中实现如下:
    procedure Tinvoicequiry.DBGrid1TitleClick(Column: TColumn);
    var invoiceid,tempstr,sortstr,inittitile :string;
    begin
        adoquery1.Sort := column.DisplayName + ' ' + Getsortmode1;
    end;测试时可以达到排序的效果,现在的问题是如何在排序的那个属性的那一栏内实现排序的标记呢?就是楼上各位实现中的那些三角符号,在我的程序中应该怎么添加呢,楼上各位的东西我看不太明白,
    所以请在我的代码的基础上给予指点,多谢!