怎样在DBGrid中点击某一列标题时表中的值就按这一列排序?

解决方案 »

  1.   

    步骤如下: 一、先建立一数据表 该表以Delphi 中最常用的Paradox为类型,取名为Student,反映(在职)学生的基本情况。该表各字段定义如下: -------------------------------------------- 字段名    类型      大小 序号     Short型     / (Key*) 学号     Alpha型     6 出生日期   Date型      / 性别     Alpha型     2 婚否     Logical型    / 英语     Number型     / 高数     Number型     / PASCAL    Number型     / 备注     Memo型      20 ------------------------------------------- 保存后,随意往表中输入3至5条记录内容。 注:①表中必须建立关键索引(为首字段建立)。此处为“序号”字段;   ②该表中使用了Paradox常用的几种字段类型,但尚未全部包含。 二、建立项目,实现功能 1.新建一项目,并为表单添加相关控件,各控件主要属性如下表:  2.建立各Click的事件代码 Button1(打开表)的Click事件代码如下: procedure TForm1.Button1Click(Sender: TObject); begin Table1.Open; // 打开Table1关联的表Student end; Button2(关闭表单)的Click事件代码如下: procedure TForm1.Button2Click(Sender: TObject); begin Application.Terminate; end; DBGrid1的TitleClick事件代码如下: procedure TForm1.DBGrid1TitleClick(Column: TColumn); //注:本过程参数Column包含的信息量非常多 begin MySort(DBGrid1,Column); end; //调用字段排序 其中,MySort(DBGrid1,Column)为自定义的排序过程,具体代码见下述。 3.建立通用处理模块 为使该功能具有“通用性”,将其定义为一过程。 首先,预声明过程及建立两个全局私有变量: ... Type ... procedure MySort(DBGrid0:TDBGrid; Column: TColumn);//预声明过程 private { Private declarations } psIndexName:string; //记录当前索引名称 plAscend:boolean; //记录当前索引名称的索引状态 public { Public declarations } end; ... 其次,该过程完整代码如下: procedure TForm1.MySort(DBGrid0:TDBGrid; Column: TColumn); var //本模块使用到的psIndexName, plAscend两个变量见上定义 mode:char; //记录是“升序”还是“降序” ColName:string; //记录当前字段名 iCol:Integer; //记录当前列号 begin with DBGrid0.DataSource.DataSet as TTable do //Table0 begin //检测当前工作表是否已打开 if not Active then begin MessageBeep(0); Application.MessageBox('工作表尚未打开!','停止',MB_OK+MB_ICONSTOP); Abort end; //检测当前字段是否“能排序”。以下字段类型不能排序 case Column.Field.DataType of ftBoolean, ftBytes, ftBlob, //Binary ftMemo, ftGraphic, ftFmtMemo, //Formatted memo ftParadoxOle: //OLE begin MessageBeep(0); Application.MessageBox(Pchar('项目"'+Column.FieldName+'"'+'不能排序!'),'停止 ',MB_OK+MB_ICONSTOP); Abort end; end; //case mode:='0'; iCol:=Column.Field.FieldNo-1; try ColName:=Column.fieldname; if psIndexName=Column.fieldname then begin //与原来同列 if plAscend //升序 then begin mode:='2'; IndexName:=ColName+'2'; //应“降序” end else begin mode:='1'; IndexName:=ColName+'1'; //应“升序” end; plAscend:=not plAscend; end else begin //新列 IndexName:=ColName+'2'; plAscend:=false; psIndexName:=ColName; end; except on EDatabaseError do //若未有索引,则重新建立 begin Messagebeep(0); //以下新建索引 IndexName:=''; Close; Exclusive:=true; if mode='1' then AddIndex(ColName+'1',ColName,[ixCaseInsensitive],'')// else //包括'0' AddIndex(ColName+'2',ColName,[ixDescending,ixCaseInsensitive],''); Exclusive:=false; Open; try //try 1 if mode<>'1' then begin mode:='2';//转换 plAscend:=false; end else plAscend:=true; IndexName:=ColName+mode; psIndexName:=ColName; except on EDBEngineError do IndexName:=''; end //try 2 end end; First; end; //with DBGrid0.SelectedIndex:=iCol; end;//End of MySort 
      

  2.   

    处理DBGRID1的onTitleClick事件!procedure TForm1.DBGrid1TitleClick(Column: TColumn);
    begin
      ...
      你的排序代码
      ...
    end;
      

  3.   

    // 单击标题排序
    procedure TFQueryForm.DBGrid1TitleClick(Column: TColumn);
    var
      sortstr: string;
    begin
      if not (DataSource.DataSet.Eof and DataSource.DataSet.Bof) then
      begin
          SortStr:='';
          if pos(' ASC', (DataSource.DataSet as TADODataSet).Sort) > 0 then
             SortStr:=Column.Field.FieldName+' DESC'
          else
             SortStr:=Column.Field.FieldName+' ASC';      with DataSource.DataSet as TADODataSet do
             Sort:= SortStr;
      end;
    end;
      

  4.   

    procedure TForm1.DBGrid1TitleClick(Column: TColumn);   //按所选字段排序
    var
      i:integer
    begin
      for i:=0 to DBGrid1.datasource.dataset.IndexDefs.count-1 do
      if DBGrid1.datasource.dataset.IndexDefs.items[i].fields=column.Title.Caption then
      DBGrid1.datasource.dataset.indexname:=DBGrid1.datasource.dataset.IndexDefs.items[i].name;
    end;
      

  5.   

    procedure TForm1.DBGrid1TitleClick(Column: TColumn);
    begin
      query1.close;
      query1.clear;
      query1.add(....Order by DBGrid1.Columns[].FieldName);
      query1.open;
    end;
      

  6.   

    在CSDN中搜索一下,有几篇这样的帖子呢!!
      

  7.   

    在query控件里这样写(ADO)
    declare @sName varchar(20)
    Select @sName = :sName
    exec('select * From temp1 '+@sName)
    把控件的Parameters里该参数设为ftstring
    Delphi里写
    procedure TForm1.FormShow(Sender: TObject);
    begin
      with Adoquery do
      begin
        Close;
        Parameters.ParamValues['sName'] := 'order by fNo';
        Open;
      end;
    end;procedure TForm1.DBGridTitleClick(Column: TColumn);
    var
      ss : string;
    begin
      ss := 'order by '+DBGrid.SelectedField.FieldName;
      with qryMain do
      begin
        Close;
        Parameters.ParamValues['sName'] := ss;
        Open;
      end;
    end;搞顶,
    不过此招有缺陷:
    需要先把光标移到要排序的字段
      

  8.   

    给你推荐一个控件:Odac中已经有一个类似与Dbgrid的控件,可以实现你的功能
      

  9.   

    我在写一个DDM的时候就有按DBGRID随便哪列的时候对其进行升序或降序,你可参考如下代码:
    procedure TFormDDM.DBGridObjectsTitleClick(Column: TColumn);
    var
      iFieldCount : integer;
    begin
      if ADODataSetObjects.Active then
        begin
         if ADODataSetObjects.RecordCount = 0 then exit;
        end
      else
        exit; // 遍历表字段, 初始化Title标题
     for iFieldCount := 0 to ADODataSetObjects.FieldCount - 1 do
      begin
         if (Copy(DBGridOBjects.Columns[iFieldCount].Title.Caption,Length(DBGridOBjects.Columns[iFieldCount].Title.Caption)-1,2) = '▼') or (Copy(DBGridOBjects.Columns[iFieldCount].Title.Caption,Length(DBGridOBjects.Columns[iFieldCount].Title.Caption)-1,2) = '▲') then
         begin
            DBGridOBjects.Columns[iFieldCount].Title.Caption := Copy(DBGridOBjects.Columns[iFieldCount].Title.Caption,1,Length(DBGridOBjects.Columns[iFieldCount].Title.Caption)-3);
            break;
         end;
      end;if Pos('ASC', ADODataSetOBjects.Sort) > 0 then
      begin
        ADODataSetObjects.Sort := Column.FieldName +  ' DESC';
        Column.Title.Caption := Column.Title.Caption + ' ▼';
      end
    else
      begin
        ADODataSetObjects.Sort := Column.FieldName +  ' ASC';
        Column.Title.Caption := Column.Title.Caption + ' ▲';
      end;
    end;
      

  10.   

    建议去搜索一下dbgrid
    你会看到很多的例子,应该有一个适合你!
    我就这样找的
    :D
      

  11.   

    如果是用ADO的话
    procedure Tform1.DBGrid2TitleClick(Column: TColumn);
    begin
          if tosort then
             ADOQuery1.Sort := Column.FieldName + ' ASC'
          else
             ADOQuery1.Sort := Column.FieldName + ' DESC';
          tosort := not tosort;
    end;
    //tosort为全局变量