procedure TFormjzls.DBGrid1TitleClick(Column: TColumn);
var
ifieldcount:integer;
begin  //if not DBGrid1.activ then exit;
  for iFieldCount := 0 to DBGrid1.Columns.Count - 1 do
  begin
     if (Copy(DBGrid1.Columns[iFieldCount].Title.Caption,Length(DBGrid1.Columns[iFieldCount].Title.Caption)-1,2) = '▼') or (Copy(DBGrid1.Columns[iFieldCount].Title.Caption,Length(DBGrid1.Columns[iFieldCount].Title.Caption)-1,2) = '▲') then
     begin
        DBGrid1.Columns[iFieldCount].Title.Caption := Copy(DBGrid1.Columns[iFieldCount].Title.Caption,1,Length(DBGrid1.Columns[iFieldCount].Title.Caption)-3);
        break;
     end;
  end;
  if Column.FieldName = FSortField then
  begin
     if FSort = 'DESC' then
        FSort := 'ASC'
     else
        FSort := 'DESC';
  end
  else begin
    FSortField := Column.FieldName;
    FSort := 'ASC';
  end;
  if FSort = 'ASC' then
     Column.Title.Caption := Column.Title.Caption + ' ▲'
  else
     Column.Title.Caption := Column.Title.Caption + ' ▼';
     adotable1.Sort := Column.FieldName + ' ' + FSort;end;

解决方案 »

  1.   

    一个较笨的方法:
    就是每次点击时,根据Column的Field来重新组织语句.
      

  2.   

    根据field属性设置indexbyname.
    如:case column of
       indexbyname:=fieldname1;
       indexbyname:=fieldname2;
      

  3.   


    SQL:='Select * From Table Order by '+VarStr;
      

  4.   

    同意johnsonrao(johnson) 的意见,编辑可用相应的edit来做,做完后直接提交。
      

  5.   

    在sql里用order后表就不能被编辑了,不好。
      

  6.   

    在dbgrid中ontitleclick
    if column.fieldname= 'fieldname' then 
      indexfieldnames:= 'fieldname';
      

  7.   

    如果想要速度快,就用CLIENTDATASET,因为他不需要重新到数据库里进行查询,只是本地进行排序。所以这个是最好的。还可以多个字段进行排序。不管有没有索引什么的。
      

  8.   

    在sql里用order后表就不能被编辑了,不好。???可以编辑!
      

  9.   

    songyoung(rocksong),ClientDataSet用法简单如下:
    加一个TDataSetProvider,和一个TClientDataSet..
    DataSetProvider连接你原来的数据集,ClientDataSet连接这个Provider.
    DBGRID的数据源就改为指向这个ClientDataSet..在dbgrid中ontitleclick
      indexfieldnames:= Column.FieldName;它与数据集原来的索引无关,只是在内存中排序,效果应该能够令人满意.
      

  10.   

    songyoung(rocksong),ClientDataSet用法简单如下:
    加一个TDataSetProvider,和一个TClientDataSet..
    DataSetProvider连接你原来的数据集,ClientDataSet连接这个Provider.
    DBGRID的数据源就改为指向这个ClientDataSet..在dbgrid中ontitleclick
      indexfieldnames:= Column.FieldName;它与数据集原来的索引无关,只是在内存中排序,效果应该能够令人满意.