-1
我試圖在德爾福DBGrid中實施展開/摺疊選項。 不幸的是,它不是默認支持的選項。用於顯示的數據來自ADOStoredProcedure。Delphi DBgrid展開/摺疊
該函數具有用於向DBGrid中進行,使用替代部件的lib不是一個選項。雖然SMDBGrid是可用的(也不支持e/c)
搜索谷歌還沒有給我任何有用的東西。我想知道這裏是否有人解決了這個問題或者如何去解決這個問題。
在此先感謝!
我試圖在德爾福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