zoukankan      html  css  js  c++  java
  • DBGridEh 点击表头排序方法

    方法1: (不用编程写代码)

    程序中引用 单元 EhLibCDS
    设置DBGridEh的属性:
          ColumnDefValues.Title.TitleButton = True
          OptionsEh = [ghAutoSortMarking, dghMultiSortMarking]
          SortLocal = True 

    参考:

    以下翻译来自EhLib/DataService/readme.txt

    “在 Ehlib 的 DataService 文件夹下提供了一些可以使数据集实现自动排序的文件。TDBGridEh 使用这些文件中的相关对象可以实现当排序标记发生变化时实现自动排序。
    “如果你改变了数据网格及标题的排序标记而没有书写 OnSortMarkingChanged 事件,数据网格将尝试自动进行数据排序。
    “DBGridEhDataService尝试通过 GetDatasetFeaturesForDataSet 查找 TDataSet 中可以排序的特定的对象。正如你所知道的,TDataSet 不支持数据排序,但它的派生对象 TQuery 或 TClientDataSet 却允许实现数据排序。

    “使用过程 RegisterDatasetFeaturesEh ,你可以注册 TDatasetFeaturesEhClass 类对指定的数据集排序。

    “EhLib已经实现了能在TQuery, TADOQuery 和TClientDataSet对象中排序数据的类。简单地通过 uses 子句添加 Ehlib...(EhlibBDE,EhlibADO,EhlibCDS)的单元之一到你的工程的任意单元中,与它们相连的数据网格将自动对该数据集进行排序。 EhLibBDE, EhLibADO, EhLibCDS 通过在单元数据集中调用 RegisterDatasetFeaturesEh 过程来实现初始化。
    “对于其它数据集类型,你必须编写、并注册可以实现该数据集排序的新对象。书写过程 T[你的数据集]DatasetFeaturesEh.ApplySorting ,你可以存取那些使用了 SortMarkedColumns 属性的列以实现直接排序。你可以查看 DbUtilsEh 单元中的示例以明白如何编写T[你的数据集]DatasetFeaturesEh 类及查看 EhLibBDE 单元以明白如何注册 T[你的数据集]DatasetFeaturesEh 类。

    引擎 数据集 单元文件

    BDE TQuery EhLibBDE

    ADO TADOQuery EhLibADO

    ClientDataSet TClientDataSet EhLibCDS

    DBExpress TSQLQuery EhLibDBX 

    方法2:

    在我的OnTitleClick事件中:
    case Column.Title.SortMarker of
    smNoneEh: Column.Title.SortMarker := smDownEh;
    smDownEh: Column.Title.SortMarker := smUpEh;
    smUpEh: Column.Title.SortMarker := smNoneEh;
    end;

    在我的OnSortMarkingChanged事件中:
    ShowMessage('marker changed!'); //从来都没运行.Why???????
    //添加Order By语句

    我的DBGridEh属性页中,OptionsEh里设置:
    dghautosortmarking=True;

    请用过Ehlib2.1的高手指点一下:如何设置使OnSortMarkingChanged事件发生作用.
    在Ehlib的Demo1里,没有设置OnTitleClick事件,不知为何也能排序?
    set DBGridEh1.Column[i] TitleButton := True

    dbgridEh有一个属性frozencols
    你设为1,则你的第一列就固定了
    设为2,前两列固定,依次。。。

    procedure Tbranch_type_frm.dbg1TitleClick(Column: TColumnEh);
    begin
    if not (adoquery1.IsEmpty) then adoquery1.Sort:=Column.Field.FieldName;
    end;
    ;//排序
    第二个问题:Demo中没有对OnTitleClick编程,对OnTitleBtnClick编程已注释,如下:
    { case Column.Title.SortMarker of
    smNoneEh: Column.Title.SortMarker := smDownEh;
    smDownEh: Column.Title.SortMarker := smUpEh;
    smUpEh: Column.Title.SortMarker := smNoneEh;
    end;}
    而且这段程序的作用只是控制排序显示的上下图标,不产生实际的排序郊果

    我自己的解决方法:
    procedure TForm1.DBGridEh1TitleClick(Column: TColumnEh);
    var
    i: Integer;
    s: String;
    FieldStr: String;
    Oldsql,NewSql:String;
    begin
    LockWindowUpdate((self).Handle);
    s := '';
    i := Column.Index;
    FieldStr := DBGridEh1.Columns[i].FieldName;;
    if DBGridEh1.Columns[i].Title.SortMarker = smNoneEh then
    begin
    DBGridEh1.Columns[i].Title.SortMarker := smDownEh;
    s := 'order by '+ FieldStr;
    end
    else
    if DBGridEh1.Columns[i].Title.SortMarker = smDownEh then
    begin
    DBGridEh1.Columns[i].Title.SortMarker := smupEh;
    s := 'order by '+ FieldStr + ' Desc';
    end
    else
    begin
    DBGridEh1.Columns[i].Title.SortMarker := smDownEh;
    s := 'order by '+ FieldStr;
    end;
    OldSql := simpleDataSet1.DataSet.CommandText;
    i := pos('order by ',OldSql);
    if i <> 0 then
    NewSql := copy(OldSql,0,i-1) + s
    else
    NewSql := OldSql + ' ' + s;
    if NewSql <> OldSql then begin //如果不相等就开始
    SimpleDataSet1.PacketRecords := 10;
    SimpleDataSet1.Active := False;
    SimpleDataSet1.DataSet.CommandText := NewSql;
    SimpleDataSet1.Active := True;
    end;
    LockWindowUpdate(0);
    end;

    部分参数:
    Flat: True xp风格
    Options-dgRowSelect 选择一个则显示一行, (会将edit自动设为False)
    字段的 DisplayFormat #,##0.00;-#,##0.00 格式化数字显示
    CheckBoxes 设为checkbox控件状. 如果是integer形 则设Footer中的keylist和Picklist,一个是值一个是显示

     

  • 相关阅读:
    [Redis]在.NET平台下的具体应用
    [Redis]在Windows下的下载及安装
    【重读MSDN之ADO.NET】ADO.NET连接
    贪心
    树状数组
    并查集
    模拟
    kruskal
    树链剖分
    匈牙利算法
  • 原文地址:https://www.cnblogs.com/smartlittleant/p/4066286.html
Copyright © 2011-2022 走看看