三层结构,用ADOConnection+ADOQuery+DataSetProvider+SocketConnection+ClientDataSet搭建,感知控件用DBGridEh1实现,当击DBGridEh1的标题时,可以实现对数据的升序和降序进行排序,代码如下:
procedure TFormFifth.DBGridEh1TitleBtnClick(Sender: TObject;  ACol: Integer; Column: TColumnEh);
var
  i : integer;
begin
  if ClientDataSet1.IndexFieldNames<>'' then
  begin
    i := TClientDataSet(ClientDataSet1).IndexDefs.IndexOf('i'+Column.FieldName);  //取得列的序号
    if i = -1 then
    begin
      with ClientDataSet1.IndexDefs.AddIndexDef do
      begin
        Name       := 'i'+Column.FieldName;
        Fields     := Column.FieldName;
        DescFields := Column.FieldName;
      end;
    end;
    ClientDataSet1.IndexFieldNames := '';
    ClientDataSet1.IndexName := 'i'+Column.FieldName;
  end
  else
  begin
    ClientDataSet1.IndexName := '';
    ClientDataSet1.IndexFieldNames := Column.FieldName;
  end;
end;可是当用两个TClientDataSet实现主从表时,点击从表的DBGridEh2的标题时,会出现:
ClientDataSet2 : Field index out of range
的错误消息。主从表的连接用:
ClientDataSet2.MasterSource := ClientDataSet1;
ClientDataSet2.IndexFieldNames := 'CustNo';
ClientDataSet2.MasterFields := 'CustNo';请指教!谢谢!

解决方案 »

  1.   

    1、首先设置dbGridEh里需要排序的字段的Title->Titlebutton属性为true
    2、设置dgGridEh的optionsEh->dbhautoSortMarking属性为true
    3、在dbGridEh的ontitleButtonClick事件里面判断。
    procedure Tfrmmain.dbgGridEh1TitleBtnClick(Sender: TObject; ACol: Integer;
      Column: TColumnEh);
    var
      SortString:String;
    begin
      if Column.Title.SortMarker = smDownEh then
         SortString:= Column.FieldName+ ' ASC'
        else
         SortString:= Column.FieldName+ ' DESC';  TADODataSet(TDbGridEh(Sender).DataSource.DataSet).Sort:=SortString;
    end;
      

  2.   

    感谢swcsoft的回复,ClientDataSet里根本没有Sort属性,只能用我上面的代码进行排序。单表的排序用上面的代码没有问题,可是主从表中从表用上面的代码就会出现:
    ClientDataSet2 : Field index out of range
    的错误。
      

  3.   

    不用自己写代码!DBGrideh实现自动排序:1.在optioneh中设置:
    AutosortMarking:=True
    2.设置DbGridEh的属性:(不一定总要设置,与使用的数据连接有关)
    sortlocal:=True;
    3.uses 单元
    Ado------ehlibADo
    TclientData------ehlibCDS
    BDE ---------ehlibBDE
    4.Column属性
    TitleButton:=True 可还是只能在单表中进行,在从表中排序时,还是出现:
    ClientDataSet2 : Field index out of range
    的错误。
    这就与代码没什么关系了,因为根本就没有写代码。
      

  4.   

    可能是从表在更新排序的时候 dbgrideh没有监测到数据源,所以没有字段信息,就会出错。
      

  5.   

    支持~~~laiyongjun(老渔翁)~~~
    不用写代码`~`不过,最好在AdoQuery里把字段都加进去`~不加字段的话可能会有些问题`~我曾经也遇到一些莫明的情况,字段都加进AdoQuery里就没事了```
      

  6.   

    谢谢  IUPRG(遨游弛行,琢符弄图)  和 ron_xin(星雨) 两们的解答。To IUPRG(遨游弛行,琢符弄图):
     主要是点标题排序时要改变IndexFieldNames,而主、从表的连接又要靠IndexFieldNames字段,所以就出问题了,解决的方法暂时找不到。To ron_xin(星雨):
      把字段加进去的方法我没有试过,我试一下看!