三层结构,用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';请指教!谢谢!
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';请指教!谢谢!
解决方案 »
- 送分问题,请教一个简单线程.
- 如何把过滤的结果集赋值给DataSet
- delphi 7中没有qreport类组件
- 请问一下在delphi里怎么设置多用户来控制权限??
- richedit如何实现对全文的查找并改变找到的字符的颜色!!!
- 高分请教关于Excel数据源的几个问题!
- 送分:数据导入和导出问题
- 请问怎么实现StringGrid中的数据向下COPY?
- 怎样将位图的颜色转化为16色???
- 怎样让用 webbrower 编的多页面浏览器(类似tencent)有自己的Cookie 文件夹? 多谢各位大虾!
- dxfprogressbar,dxfclock 求2个控件下载啊!?
- 在主从表中,点击从表的DBGridEh2的标题进行排序时,会出现错误,请指教!
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;
ClientDataSet2 : Field index out of range
的错误。
AutosortMarking:=True
2.设置DbGridEh的属性:(不一定总要设置,与使用的数据连接有关)
sortlocal:=True;
3.uses 单元
Ado------ehlibADo
TclientData------ehlibCDS
BDE ---------ehlibBDE
4.Column属性
TitleButton:=True 可还是只能在单表中进行,在从表中排序时,还是出现:
ClientDataSet2 : Field index out of range
的错误。
这就与代码没什么关系了,因为根本就没有写代码。
不用写代码`~`不过,最好在AdoQuery里把字段都加进去`~不加字段的话可能会有些问题`~我曾经也遇到一些莫明的情况,字段都加进AdoQuery里就没事了```
主要是点标题排序时要改变IndexFieldNames,而主、从表的连接又要靠IndexFieldNames字段,所以就出问题了,解决的方法暂时找不到。To ron_xin(星雨):
把字段加进去的方法我没有试过,我试一下看!