【问题标题】:Delphi DBgrid Expand/CollapseDelphi DBgrid 展开/折叠
【发布时间】:2015-06-07 03:17:19
【问题描述】:

我正在尝试在 Delphi DBGrid 中实现 展开/折叠 选项。 遗憾的是,它不是默认支持的选项。用于显示的数据来自 ADStoredProcedure

必须为 DBGrid 创建函数,使用替代组件库 不是一种选择。 SMDBGrid 是可用的(也不支持 e/c)

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

提前致谢!

【问题讨论】:

  • Virtual Treeview。在 Downloads 部分,您可以找到 demo appsVirtual Treeview contributionsadd onsVirtual Treeview and databases,包括 DB 感知版本和示例。
  • @Abelisto 我已经编辑了这个问题,遗憾的是,使用替代组件不是一种选择。我正在寻找一种在 DBGrid 中实现该功能的方法
  • 所以你必须处理 DataSet (ADOStoredProcedure),而不是 DBGrid。处理 DBGrid 上的一些事件(例如 OnDblClick)并过滤/取消过滤 DataSet 中的记录。
  • 我目前正在尝试通过单击指示器来解决此问题(仍在进行中)但是有没有办法显示行是否展开/折叠
  • 查看 DBGrid 上的 OnDrawXXX 事件。您还可以使用字段编辑器在数据集中创建计算字段 (FieldKind := fkInternalCalc)。 fkInternalCalc 很重要,因为它不仅可以计算其他字段的值,还可以编辑和存储值。

标签: delphi stored-procedures adodb dbgrid


【解决方案1】:

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

用于存储展开项的类

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;

希望这对某人有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-13
    • 2013-06-06
    • 2012-05-30
    • 2017-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多