怎么对adotable表进行排序?

ntcxh 2008-02-04 10:59:49
本人在C++BUILDER中,运用DBGRIEDEH与ADOTABLE相连,请问如何能够根据点击DBGRIEDEH的标题栏后进行相应的排序?多谢各位高手的指教。
...全文
101 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
cygjhjc 2009-09-19
  • 打赏
  • 举报
回复
非常感谢ydlchina,第一种方法是完全可行的,在ADOTable中也不会出现任何错误!
ydlchina 2008-02-04
  • 打赏
  • 举报
回复
这有点资料你参考,原理是一样的(DBGrid)
方法1
自用极品代码:

添加定义:

C/C++ code
TField *FSortField;
void __fastcall SetSortField(TField *Value);
__property TField *SortField = {read=FSortField,write=SetSortField};





C/C++ code
void __fastcall TForm1::SetSortField(TField *Value)
{
static bool DescSort = false;
try {
Screen->Cursor = crHourGlass;
if (FSortField != NULL) {
AnsiString label = FSortField->DisplayLabel;
FSortField->DisplayLabel = label.SubString(1,label.Length()-3); //删除尾部排序字符
}

if (FSortField == Value)
DescSort = !DescSort;

ADOTable1->Sort = Value->FieldName + " " + (DescSort?"DESC":"ASC");
Value->DisplayLabel = Value->DisplayLabel + (DescSort?" -":" +");
FSortField = Value;
}
__finally {
Screen->Cursor = crDefault;
}
}
//排序操作
void __fastcall TForm1::DBGrid1TitleClick(TColumn *Column)
{
SortField = Column->Field;
}




以上代码操作简单,不过只是用+和-表示了正向和逆向,自己可以用画图的方法做漂亮点

方法2
DBGrid1TitleClick事件中写

TADOQuery* temp=(TADOQuery*)DBGrid2- >DataSource- >DataSet;
//temp=NULL;
if(flag==1)//当前是升序
{
temp- >Sort=Column- >FieldName+" DESC";
flag=0;
}
else if(flag==0)//当前是降序
{
temp- >Sort=Column- >FieldName+" ASC";
flag=1;
}

这样就可以了。
DBgridEh- >字段的TitleButton为true并且DBgridEh- >optionEh的dghAutoSortMarking为true时,在title上会出现排序三角形。
void __fastcall TForm1::DBGridEh1TitleClick(TColumnEh *Column)
{
这里写排序代码;
}
ntcxh 2008-02-04
  • 打赏
  • 举报
回复
首先谢谢余粮的帮助,我采用的是第二种方法,可以如果运用的是ADOQUERY是可以的,如果改为用ADOTABLE则提示出错。不过,三角形的标记会出现,出错信息为:在对应所需名称或序数的集合中,未找到项目;

1,178

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 数据库及相关技术
社区管理员
  • 数据库及相关技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧