Delphi DBgrid展开/折叠

问题描述:

我试图在德尔福DBGrid中实施展开/折叠选项。 不幸的是,它不是默认支持的选项。用于显示的数据来自ADOStoredProcedureDelphi DBgrid展开/折叠

该函数具有用于向DBGrid中进行,使用替代部件的lib不是一个选项。虽然SMDBGrid是可用的(也不支持e/c)

搜索谷歌还没有给我任何有用的东西。我想知道这里是否有人解决了这个问题或者如何去解决这个问题。

在此先感谢!

+0

[Virtual Treeview](http://www.soft-gems.net/index.php/controls/virtual-treeview)。在[Downloads](http://www.soft-gems.net/index.php/all-downloads)部分,您可以找到[demo apps](http://www.soft-gems.net/supplement/download .php?ID = 33),[Virtual Treeview贡献](http://www.soft-gems.net/supplement/download.php?ID=50),[adds](http://www.soft- gems.net/supplement/download.php?ID=31)和[虚拟Treeview和数据库](http://www.soft-gems.net/supplement/download.php?ID=60),包括DB感知版本和例子。 – Abelisto 2015-04-02 09:02:23

+0

@Abelisto我已经编辑了这个问题,使用替代组件不是一个可悲的选择。我正在寻找一种方法来实现DBGrid中的函数 – PieterSchool 2015-04-02 09:06:17

+0

因此,您必须处理DataSet(ADOStoredProcedure),而不是使用DBGrid。处理DBGrid上的某些事件(例如OnDblClick)并过滤/未过滤DataSet中的记录。 – Abelisto 2015-04-02 09:16:33

花了一些时间,但我设法使用数据集上的动态过滤器为DBGrid创建te功能。我会将代码发布给需要此功能的人员。

类存储扩展项目

type 
    //Store ID's used to keep expanded items 
    TPlanningFilterItem = class(TObject) 
    public 
     Sublevel, ProjectID, OnderdeelID, MedewerkerID: integer; 
    end; 

拍摄指标点击

procedure TFPlanningOverzicht.GridPlanningDblClick(Sender: TObject); 
    var 
    P: TPoint; 
    C: TGridCoord; 
    begin 
    GetCursorPos(P); 
    P := (Sender as TCustomGrid).ScreenToClient(P); 
    C := (Sender as TCustomGrid).MouseCoord(P.X, P.Y); 

    //Only capture indicator row X = 0 
    //Ignore title indicator Y > 1 
    if (C.X = 0) AND (C.Y > 0) then 
     DatasetFilterToevoegenVerwijderen; 
     FilterDataSet; 
    begin 
    end; 
    end; 

添加或删除过滤器

procedure TFPlanningOverzicht.DatasetFilterToevoegenVerwijderen; 
    var 
    newFilterItem: TPlanningFilterItem; 
    tmp: TPlanningFilterItem; 
    I: Integer; 
    begin 
     newFilterItem := TPlanningFilterItem.Create; 
     newFilterItem.Sublevel := DPlanning.PlanningOverzicht.FieldByName('SUBLEVEL').AsInteger; 
     newFilterItem.ProjectID := DPlanning.PlanningOverzicht.FieldByName('ProjectID').AsInteger; 
     newFilterItem.OnderdeelID := DPlanning.PlanningOverzicht.FieldByName('OnderdeelID').AsInteger; 
     newFilterItem.MedewerkerID := DPlanning.PlanningOverzicht.FieldByName('MedewerkerID').AsInteger; 

     //Ignore expand when deepest lvl reached 
     if newFilterItem.Sublevel > 2 then 
     Exit; 

     for I := 0 to GridFilterItems.Count - 1 do 
     begin 
     //Compare to existing 
     tmp := GridFilterItems.Items[I]; 
     if (tmp.Sublevel = newFilterItem.Sublevel) AND 
      (tmp.ProjectID = newFilterItem.ProjectID) AND 
      (tmp.OnderdeelID = newFilterItem.OnderdeelID) AND 
      (tmp.MedewerkerID = newFilterItem.MedewerkerID) 
     then 
     begin 
      //If item currently expanded collapse and exit 
      GridFilterItems.Delete(I); 
      Exit; 
     end; 
     end; 

     //Item not yet expanded, so expand 
     GridFilterItems.Add(newFilterItem); 
    end; 

应用滤镜

procedure TFPlanningOverzicht.FilterDataSet; 
    var 
    I: integer; 
    tmp: TPlanningFilterItem; 
    Filter: string; 
    C: Integer; 
    begin 
    //Always show top level items 
    Filter := '(SUBLEVEL = ''' + IntToStr(1) + ''') OR '; 

    for I := 0 to GridFilterItems.Count - 1 do 
    begin 
     tmp := GridFilterItems[I]; 

     //Expand when 1st row selected (shoud be written to your case) 
     if (tmp.Sublevel= 1) then 
     begin 
     Filter := Filter + 
     '(MedewerkerID = ''' + IntToStr(tmp.MedewerkerID) + ''' AND ' + 
     'SUBLEVEL = ''' + IntToStr(2) + ''') OR '; 
     end 
     else 
     begin 
     //Expands for the second level (shoud be written to your case) 
     Filter := Filter + 
     '(MedewerkerID = ''' + IntToStr(tmp.MedewerkerID) + ''' AND ' + 
     'OnderdeelID = ''' + IntToStr(tmp.OnderdeelID) + ''' AND ' + 
     'SUBLEVEL = ''' + IntToStr(3) + ''') OR '; 
     end; 
    end; 

    //Remove last or 
    Delete(Filter, Filter.Length - 2, 3); 

    GridPlanning.DataSource.DataSet.Filter := Filter; 
    GridPlanning.DataSource.DataSet.Filtered := True; 
    end; 

希望这将是有用的人。