DBGrid如何对字段排序?

解决方案 »

  1.   

    若关联table:
    procedure TForm1.DBGrid1TitleClick(Column: TColumn);
    begin
        with DataSource.DataSet as TTable do
        begin
          if  not Column.Field.IsBlob and (Column.Field.FieldKind = fkdata) then
             IndexFieldNames := Column.FieldName;
        end;
    end;
      

  2.   

    注意table的catchedupdate 置为false!
      

  3.   

    如果你用的是query做為數據集﹐則不用寫語句。加上申明﹕uses EhlibBDE;如果用其它的數據集﹐就要寫語句﹕如yosoft()
      

  4.   

    下面是点击dbgrid的title就排序的程序:
    procedure TFHkdata.SortQuery(Column:TColumn);
    var
      SqlStr,myFieldName,TempStr: string;
      OrderPos: integer;
      SavedParams: TParams;
    begin
      if not (Column.Field.FieldKind in [fkData,fkLookup]) then 
        exit;
      if Column.Field.FieldKind =fkData then
        myFieldName := UpperCase(Column.Field.FieldName)
      else
        myFieldName := UpperCase(Column.Field.KeyFields);
      while Pos(myFieldName,';')<>0 do
        myFieldName := copy(myFieldName,1,Pos(myFieldName,';')-1)
                       + ',' + copy(myFieldName,Pos(myFieldName,';')+1,100);
      with TQuery(TDBGrid(Column.Grid).DataSource.DataSet) do
      begin
        SqlStr := UpperCase(Sql.Text);
        if ParamCount>0 then
        begin
          SavedParams := TParams.Create;
          SavedParams.Assign(Params);
        end;
        OrderPos := pos('ORDER',SqlStr);
        if (OrderPos=0) or
          (pos(myFieldName,copy(SqlStr,OrderPos,100))=0) then
          TempStr := ' Order By ' + myFieldName + ' Asc'
        else 
          if pos('ASC',SqlStr)=0 then
            TempStr := ' Order By ' + myFieldName + ' Asc'
          else
            TempStr := ' Order By ' + myFieldName + ' Desc';
            if OrderPos<>0 then 
              SqlStr := Copy(SqlStr,1,OrderPos-1);
      SqlStr := SqlStr + TempStr;
      Active := False;
      Sql.Clear;
      Sql.Text := SqlStr;
      if ParamCount>0 then
      begin
        Params.AssignValues(SavedParams);
        SavedParams.Free;
      end;
      Prepare;
      Open;
    end;
    end;