三层结构,用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.   

    不用自己写代码!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
    的错误。
    这就与代码没什么关系了,因为根本就没有写代码。
      

  2.   

    不好意思,什么是lookup字段?
      

  3.   

    没有Lookup字段,与字段有关的只有主、从表的关联字段。