CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

怎样在DBGrid控件里实现排序,谢谢。

楼主flytiger1977(武松!你敢来?^_^)2001-07-25 11:10:07 在 Delphi / VCL组件开发及应用 提问

怎样在DBGrid控件里实现排序,谢谢。 问题点数:15、回复次数:18Top

1 楼ymkj(ymkj)回复于 2001-07-25 11:16:03 得分 2

(转)  
   
  欲实现点击DBGrid的Title对查询结果排序,想作一个通用程序,不是一事一议,    
  而且点击另一个Title时又要另外排序,目的是想作到象资源管理器那样随心所欲。    
  procedure   TFHkdata.SortQuery(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   pos(myFieldName,SqlStr)=0   then   exit;    
          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;    
   
  上面的是对query进行排序的过程。    
  不过有个问题是如果DBGRID所使用的数据集不是TQuery而是TTable或其他的话可能会出错!如果需要实现这样的功能,建议使用Express   Grid套件!   Top

2 楼geliang(回来的光芒)回复于 2001-07-25 11:19:08 得分 3

DBGrid是通过数据集来显示的,你可以通过Sql语句来排序Top

3 楼wz2001(板凳程序员)回复于 2001-07-25 12:54:47 得分 0

多建几个索引,响应ontitle事件,调用相应的索引不是更方便吗?Top

4 楼baseman(乌龙茶)回复于 2001-07-25 13:03:30 得分 0

GZTop

5 楼songrock(rocksong)回复于 2001-07-25 21:11:46 得分 0

用sql排序只能浏览,不能编辑数据!Top

6 楼hicaci(九冲)回复于 2001-07-25 22:19:54 得分 3

我还用过一个方法:  
  开一个很大的数组,然后将query的来的数据全部存在与该数组中,然后使用stringgrid与该数组一起使用,想选什么就在本地这数组中选就ok   拉。但写起来很烦,并且很多漏洞。比如的确数据太多了等等--所以这是个本方法,所一我觉得我是个白痴  
   
  算拉。Top

7 楼cobi(我是小新)回复于 2001-07-25 22:45:21 得分 0

gzTop

8 楼flytiger1977(武松!你敢来?^_^)回复于 2001-07-26 17:49:49 得分 0

不,用SQL(通过Query)可以进行编辑,不过,我不想用SQL语句来排序,那样如果数据很多就会很慢。Top

9 楼DepYuka()回复于 2001-07-26 18:15:42 得分 5

DBGrid->DataSource->ClientDataSet->DataSetProvider->Query->DataBase  
   
  然后用Query查出想要的数据,在ClientDataSet的IndexFieldNames里指定想按什么字段排序。  
   
  更新数据就用ClientDataSet的Applyupdates,如果想多表更新,就要加多一个UpdateSQL指向Query。  
   
  这是最简单的解决方法,D5下试过没问题,就是放多了两个控件,程序大了一点。   :)Top

10 楼Nicky_he(尼克)回复于 2001-07-26 18:54:01 得分 0

要是你用的是ADO那就方便了,  
  AdoDataset.sort:=‘field1   ASC’Top

11 楼andykwok(Andy Kwok)回复于 2001-07-26 19:59:27 得分 0

如果用ADO的话用字段排序属性就行了!呵呵!Top

12 楼songrock(rocksong)回复于 2001-07-26 20:07:03 得分 0

用sql的order   by   语句后的查询结果是不能编辑的。Top

13 楼DepYuka()回复于 2001-07-26 23:41:07 得分 0

可以编辑,不过要用到updateSQL.  
   
  Top

14 楼j_xuhome(臭名招著的程序员)回复于 2001-07-27 00:27:01 得分 0

gzTop

15 楼liuzhiping(liuzhiping)回复于 2001-07-27 08:53:07 得分 0

九冲:你是猛男!Top

16 楼willingsilly()回复于 2001-07-27 21:15:03 得分 0

为什么我不懂?Top

17 楼halfdream(哈欠)回复于 2001-07-28 00:03:54 得分 2

http://www.csdn.net/expert/topic/176/176628.shtm  
   
  这问题已经问过好几次了。  
   
  Top

18 楼crm2000(浏览器)回复于 2001-09-18 20:32:11 得分 0

采用ClientDataSet的方法可以,但是如何设置它为升序或者降序排列呢?Top

相关问题

  • 急急急:如何让dbgrid控件实现排序功能,,100分
  • 如何实现dbgrid控件与combobox控件的结合
  • ListView(或DBGrid)中,单击列頭可自動排序的控件在哪?
  • 请问在MSFlexGrid或VSFLexGrid控件中能否实现按多级排序?
  • AspNetPager分页控件怎么和datagrid控件结合起来,如何实现强排序(换页后排序功能保留)
  • ListView控件如何排序?
  • 如何实现点击DBGrid的字段名进行排序?
  • DBGrid 怎么实现单击表头排序?
  • 请教:如何双击dbgrid的列名实现排序
  • DBGrid 控件

关键词

  • 排序
  • 控件
  • 数据
  • 语句
  • sql
  • myfieldname
  • sqlstr
  • orderpos
  • savedparams
  • 数组

得分解答快速导航

  • 帖主:flytiger1977
  • ymkj
  • geliang
  • hicaci
  • DepYuka
  • halfdream

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo