1、我看到一些软件是,按一下DBGrid上的字段,就可以按该字段的升序排,再按一下又按文书字段的降序排,这是怎么做的?
2、如果有一个EDIT和一个"查询"按钮和一个DBgrid窗口,我想在EDIT中输入数字,按下"查询"按钮后,在DBGrid中就显示到查询的此行,怎么做?

解决方案 »

  1.   

    procedure TWardDocForm.DBGrid2TitleClick(Column: TColumn);
    var
       OrderString : string;
    begin
       if Column.ID > 3 then
          Exit;
       if(Column.Field.FieldName = 'No') then
          OrderString:=' ORDER BY FETALFIL."NO" ';
       if(Column.Field.FieldName = 'Name') then
          OrderString:=' ORDER BY FETALFIL."NAME" ';
       if(Column.Field.FieldName = 'OLD') then
          OrderString:=' ORDER BY FETALFIL."OLD" ';
       if(Column.Field.FieldName = 'YZ') then
          OrderString:=' ORDER BY FETALFIL."YZ" ';   Column.Title.Font.Color:= clMaroon;
       with FetalFilQuery do
       begin
          Close;
          SQL.Clear;
          SQL.Add(SQLString+OrderString);
          Open;
          last;
       end;
    end;
    第二个问题
    用Locate
      

  2.   

    1:在ontitleclick事件里处理!
    2:还没找到好的方法:
    dbgrid.disablecontrol;
    dbgrid.datasource.dataset.first;
    i:=1;
    while not dbgrid.datasource.dataset.eof do 
    begin
      if i=num then
         break
      else i:=i+1;
    dbgrid.datasource.dataset.next
    end;
    dbgrid.enablecontrol;
      

  3.   

    Procedure OrderGrid(Column: TColumn);
    Var
      DataSet: TDataSet;
      FieldNames:String;
    Begin
      if Column.Field=nil then Exit;
      if not Column.Field.DataSet.Active then Exit;
      if not (Column.Field.FieldKind in [fkData,fkLookup]) then exit;
      DataSet := Column.Field.DataSet;
      if Column.Field.Lookup then
        FieldNames:= Column.Field.KeyFields
      else
        FieldNames:=Column.Field.FieldName;  if DataSet is TCustomDataSet then
      with TCustomDataSet(DataSet) do
        begin
          if (Pos(FieldNames, Sort) = 1) and (Pos(' DESC', Sort) = 0) then
          Sort := FieldNames + ' DESC' else
          Sort := FieldNames + ' ASC';
        end;
    end;在DBGrid的OnTitleClick事件中调用OrderGrid(Column)就行了。
      

  4.   

    if not (Column.Field.FieldKind in [fkData,fkLookup])  then...
    这句怎么解释?
      

  5.   

    TO: BlackPoint(黑点) 
    if DataSet is TCustomDataSet then在这一句上出错,提示:[Error] Unit1.pas(175): Undeclared identifier: 'TCustomDataSet'.
    另外,Sort你没定义啊?
      

  6.   

    不好意思,我TCustomDataSet是我写错了,应该是TADOCustomDataSetif not (Column.Field.FieldKind in [fkData,fkLookup])  then...
    这句意思是:如果字段的类型不是fkData或fkLookup类型才可以排序。
      

  7.   

    我没用ADO,
    另外Sort应该定义成什么呢?
      

  8.   

    Sort在ADO中是TADOCustomDataSet的一个属性。你没用ADO那就只有想别的办法了。
      

  9.   

    TO: imageonline(被人骗了) 
    OrderString:=' ORDER BY FETALFIL."YZ" ';中的FETALFIL是什么意思?你所写的好像只能按一种顺序排序吧!我要求的是按一下“升序”再按一下“降序”
      

  10.   

    用dxDbgrid控件吧。不用写代码,自动完成你说的排序功能。
      

  11.   

    第一个问题,有的控件(如query)不支持排序的。如果你用的是d6,可以用bdeClientDataSet
      功能强大。这个问题一般的解决方法是有一个变量(boolean变量或其他)来保存点击的状态
      通过它来判断是正序还是逆序。然后做相应的排序操作。以bdeClientDataSet为例(名字设 为cds_1);
    先加索引:
      cds_1.addindex('index1','field1','');//这是正序
      cds_1.addindex('index1desc','field1',[ixDescending]);//这是逆序
    然后如果要对cds_1排序,指定使用哪个索引就行了
      cds_1.indexname:=‘index1’//调用刚才的正序索引,按field1正序排列
      cds_1.indexname;='index1des'
    第二个问题,使用filter,以ClientDAtaSet为例(query1也行),
    dbgrid连到clientdataset上,在click事件中写到
    clientdataset1.filtered:=false;
    clientdataset1.filter:='field1='+edit1.text;
    clientdataset1.filtered:=true;
    关于bdeclientdataset和clientdataset更详细的使用信息,请看delphi帮助
    '师父带进门,修行靠个人'
      

  12.   

    procedure TfrmChild.DBGrid1TitleClick(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;