2015-04-02 290 views
-1

我試圖在德爾福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

回答

1

花了一些時間,但我設法使用數據集上的動態過濾器爲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; 

希望這將是有用的人。