大家好,问一个简单的问题!
   DBGridEh列排序,当我点击列标题时,数据就按升序或降序排列,DBGridEh应该有这样的属性吧?

解决方案 »

  1.   

    自动显示标题行的升降排序标志符(▽降序△升序)并做相应排序
    DBGridEh组件可以在标题行单元格中显示小三角形升、降排序标志符图片,在运行时可点击标题行,图片自动切换并做相应排序, 
    SortMarkedColumns 为当前排序列可在运行时使用.
    然后在该列的ontitleclick事件中添加代码:
    procedure TForm_Query.DBGridEh1TitleBtnClick(Sender: TObject; ACol: Integer; Column: TColumnEh);
    var
    sortstring:string; //排序列
    begin
    //进行排序
    with Column do
    begin
    if FieldName = '' then
    Exit;
    case Title.SortMarker of
    smNoneEh:
    begin
    Title.SortMarker := smDownEh;
    sortstring := Column.FieldName + ' ASC';
    end;
    smDownEh: sortstring := Column.FieldName + ' ASC';
    smUpEh: sortstring := Column.FieldName + ' DESC';
    end;
    //进行排序
    try
    dataset.Sort := sortstring //dataset为实际数据集变量名
    except
    end;
    end;
    end;切记lookup型字段不可做上述设置,否则系统会提示错误。
    (不编程自动排序,将自动排序的属性设置完以后,记得要USE中加入EhlibAdo或者EhlibBDE、EhlibCDS这些单元的使用,具体哪个根据使用的数据库类型决定,但只能对查询类进行排序,table类是不行的,会报错。) 
      

  2.   


    procedure SortDBGridEh(Sender: TObject; ACol: Integer; Column: TColumnEh);
    var
      FieldName, SortStr: string;
    begin
      Screen.Cursor := crSQLWait;
      try
        if (Sender is TDBGridEh) and ((Sender as TDBGridEh).DataSource.DataSet <> nil) then
        begin
          if not ((Sender as TDBGridEh).DataSource.DataSet is TCustomADODataSet) then
            Exit;      if not (Sender as TDBGridEh).DataSource.DataSet.Active then
            Exit;      FieldName := Column.FieldName;
          
          if (Sender as TDBGridEh).DataSource.DataSet.FindField(FieldName).IsBlob then
            Exit;
          if (Sender as TDBGridEh).DataSource.DataSet.FieldByName(FieldName).FieldKind =
            fkData then
            SortStr := FieldName
          else if (Sender as TDBGridEh).DataSource.DataSet.FieldByName(FieldName).FieldKind =
            fkLookup then
            FieldName := (Sender as TDBGridEh).DataSource.DataSet.FieldByName(FieldName).KeyFields
          else
            FieldName := '';      if (FieldName = '') or (Pos(';', FieldName) > 0) then Exit;
          case Column.Title.SortMarker of
            smNoneEh:
            begin
                Column.Title.SortMarker := smDownEh;
                TCustomADODataSet((Sender as TDBGridEh).DataSource.DataSet).Sort := FieldName + ' ASC';
            end;        smUpEh:
            begin
                //Column.Title.SortMarker := smDownEh;
                TCustomADODataSet((Sender as TDBGridEh).DataSource.DataSet).Sort := FieldName + ' DESC';
            end;        smDownEh:
            begin
                //Column.Title.SortMarker := smUpEh;
                TCustomADODataSet((Sender as TDBGridEh).DataSource.DataSet).Sort := FieldName + ' ASC';;
            end;
          end;
        end;
      finally
        Screen.Cursor := crDefault;
      end;
    end;
    调用procedure   TForm_Query.DBGridEh1TitleBtnClick(Sender:   TObject;   ACol:   Integer;   Column:   TColumnEh);
    begin
       SortDBGridEh(Sender, ACol, Column);
    end; 
      

  3.   

    不用这么复杂。DbgridEh排序不用写代码。
    1.在OptionsEH中设置AutoSort...设置成True。
    2.引用单元 EhlibADO,如果没有,请加入到搜索路径中。如果是BDE,就是EhlibBDE。
    3.把需要排序的列和Title.TitleButton 设置为True。
      

  4.   

    ODAC我使用的是ODAC控件访问Oracle如何解决这个排序问题啊,以上方法都不行啊.
      

  5.   

    按4楼的办法,Delphi2010下不行哦,我用的DBX+FB
      

  6.   

    to 楼上
    将SortLocal属性设为True即可