Delphi DBgrid展开/折叠
问题描述:
我试图在德尔福DBGrid中实施展开/折叠选项。 不幸的是,它不是默认支持的选项。用于显示的数据来自ADOStoredProcedure。Delphi DBgrid展开/折叠
该函数具有用于向DBGrid中进行,使用替代部件的lib不是一个选项。虽然SMDBGrid是可用的(也不支持e/c)
搜索谷歌还没有给我任何有用的东西。我想知道这里是否有人解决了这个问题或者如何去解决这个问题。
在此先感谢!
答
花了一些时间,但我设法使用数据集上的动态过滤器为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;
希望这将是有用的人。
[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
@Abelisto我已经编辑了这个问题,使用替代组件不是一个可悲的选择。我正在寻找一种方法来实现DBGrid中的函数 – PieterSchool 2015-04-02 09:06:17
因此,您必须处理DataSet(ADOStoredProcedure),而不是使用DBGrid。处理DBGrid上的某些事件(例如OnDblClick)并过滤/未过滤DataSet中的记录。 – Abelisto 2015-04-02 09:16:33