Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   dynamische Spaltenanzeige vom CxGrid (https://www.delphipraxis.net/170874-dynamische-spaltenanzeige-vom-cxgrid.html)

Maya 8. Okt 2012 06:34

dynamische Spaltenanzeige vom CxGrid
 
Guten Morgen liebe Liebenden,

leider bin ich heute hier Einzelkämpferin und brauch deswegen mal einen Tipp von euch.
Und zwar arbeite ich schon in den letzten zwei Jahren mit dem CxGrid, aber bisher habe ich immer statisch angegeben, welche Spalten angezeigt werden sollen. Diesmal ist es aber notwendig, dass alle Spalten (derzeit sind es vier) angezeigt werden. Ich möchte die dynamisch angezeigt bekommen, falls später sich mal was ändert, weil eine Spalte 'rausgeschmissen wird oder was auch immer damit gemacht werden könnte. :)

Ich weiß, dass es dazu eine Option gibt, aber bei der Komplexität der möglichen Eigenschaften bei der Komponente, habe ich keine so richtige Ahnung, welche da die richtige ist.
Habt ihr einen Tipp?

Wenn ich bei Google nach CxGrid schaue, lande ich immer nur bei Beiträgen zum StringGrid, also war das bisher auch keine große Hilfe.

Dankeschön!

Bummi 8. Okt 2012 06:57

AW: dynamische Spaltenanzeige vom CxGrid
 
Da wird mehr drin sein als Du brauchst, aber das was Du suchst sollte auch dabei sein.

Delphi-Quellcode:
CLASS Procedure TTemplate.FillGridFromDataset(cxGrid: TcxGrid;ADS: TADODataSet;WithFooters:Boolean=true;SummaryKind:TcxSummaryKind=skSum;ReadonlyStyle: TcxStyle = nil;HiddenList:TStringList=nil;WidthList:TStringList=nil;displayformatList:TStringList=nil);
var
  i:Integer;
  g:TcxGridDBColumn;
  gsi,si:TcxGridDBTableSummaryItem;
  View:TcxGridDBTableView;
  cur:TCursor;

  Procedure SetVisible;
    begin
      if Assigned(Hiddenlist) then
        if Hiddenlist.IndexOfName(ADS.Fields[i].FieldName)>-1 then ADS.Fields[i].Visible := False;
    end;
  Procedure SetWidth;
    var
      w:Integer;
    begin
      if Assigned(WidthList) then
        if WidthList.IndexOfName(ADS.Fields[i].FieldName)>-1 then
          if TryStrToInt( WidthList.Values[ADS.Fields[i].FieldName],w) then ADS.Fields[i].DisplayWidth := w;
    end;
  Procedure SetDisplayFormat;
  begin
    if Assigned(displayformatList) then
      if displayformatList.IndexOfName(ADS.Fields[i].FieldName)>-1 then
        try
          if Ads.Fields[i] is TNumericField then
            TNumericField(ADS.Fields[i]).DisplayFormat:=displayformatList.Values[ADS.Fields[i].FieldName];
          if Ads.Fields[i] is TDateTimeField then
            TDateTimeField(ADS.Fields[i]).DisplayFormat:=displayformatList.Values[ADS.Fields[i].FieldName];
        except
          // Todo except
        end;
  end;

  Procedure SetFixedCols;
    var
      w:Integer;
      bv:TcxGridDBBandedTableView;
    begin
   if cxGrid.ActiveLevel.GridView is TcxGridDBBandedTableView then
      begin

      bv := TcxGridDBBandedTableView(cxGrid.ActiveLevel.GridView);
      if Assigned(WidthList) then
        if WidthList.IndexOfName('FIXEDCOLS')>-1 then
          if TryStrToInt( WidthList.Values['FIXEDCOLS'],w) then FixColumns(bv,w);
      end;
    end;

begin
  cur          := Screen.Cursor;
  Screen.Cursor := crHourGlass;

  try
  ADS.DisableControls;
  View := TcxGridDBtableView(cxGrid.ActiveLevel.GridView);
  View.OptionsBehavior.FocusCellOnTab := true;
  for I := View.DataController.Summary.FooterSummaryItems.Count - 1 downto 0 do View.DataController.Summary.FooterSummaryItems[i].Free;
  for I := View.ColumnCount - 1 downto 0 do View.Columns[i].Free;
  if WithFooters then View.OptionsView.GroupFooters := gfVisibleWhenExpanded else View.OptionsView.GroupFooters := gfInvisible;
  for I := 0 to ADS.FieldCount - 1 do
        begin
          //if (ADS.Fields[i].DataType in [ftBCD,ftFMTBCD]) and (ADS.Fields[i].Tag<>-777) then TFloatField(ADS.Fields[i]).currency := true;
          if (ADS.Fields[i].DataType in [ftBCD,ftFMTBCD]) and (ADS.Fields[i].Tag<>-777) then TFloatField(ADS.Fields[i]).DisplayFormat := '#,##0.00';
          SetVisible;
          SetWidth;
          SetDisplayFormat;
          if ADS.Fields[i].Visible then
          begin
          g := View.CreateColumn;
          g.DataBinding.FieldName := ADS.Fields[i].FieldName;
          if Assigned(ReadonlyStyle) and ((ADS.Fields[i].Datatype = ftAutoInc) or ADS.Fields[i].ReadOnly) then
                begin
                g.Styles.Content := ReadonlyStyle;
                g.Options.Focusing := false;
                g.Editing := false;
                end;
          View.OptionsView.Footer := WithFooters;
          if WithFooters then
              begin
//                if ADS.Fields[i].Datatype in [ ftSmallint, ftInteger, ftWord, ftBoolean, ftFloat, ftCurrency, ftBCD, ftfmtbcd, ftDate, ftTime, ftDateTime, ftAutoInc, ftLargeint] then
                  if (ADS.Fields[i].Datatype in [  ftCurrency, ftBCD, ftfmtbcd])  or ( ADS.Fields[i].Tag=333) then
                      begin
                        if not ((ADS.Fields[i].Datatype in [ ftDate, ftTime, ftDateTime] ) and (SummaryKind in [skSum])) then
                          begin
                          si:=TcxGridDBTableSummaryItem.Create(View.DataController.Summary.FooterSummaryItems);
                          si.Column := g;
                          si.FieldName := g.DataBinding.FieldName;
                          si.Kind := SummaryKind;
                                begin
                                gsi:=TcxGridDBTableSummaryItem.Create(View.DataController.Summary.DefaultGroupSummaryItems);
                                gsi.Column := g;
                                gsi.FieldName := g.DataBinding.FieldName;
                                gsi.Kind := SummaryKind;
                                gsi.Position := spFooter;
                                end;
                          end;
                      end;
              end;
          end;
        end;
  finally

  ADS.EnableControls;
//  View.ApplyBestFit();
  SetOneGridWidth(cxGrid);
  SetFixedCols;
  Screen.Cursor := cur;
  end;
end;

Furtbichler 8. Okt 2012 07:04

AW: dynamische Spaltenanzeige vom CxGrid
 
Der Support von DevExpress ist vorbildlich. Du kannst die Leute auch immer fragen (DP ist natürlich besser, is ja klar).

Maya 8. Okt 2012 08:14

AW: dynamische Spaltenanzeige vom CxGrid
 
Zitat:

Zitat von Bummi (Beitrag 1186175)
Da wird mehr drin sein als Du brauchst, aber das was Du suchst sollte auch dabei sein.

Aber ich bin der Meinung, dass es da einfach 'ne Option gab, wo du 'n Häckchen dran machst und fertig ist das. -.-

Aber danke für den Code, den werde ich mir heute noch zu Gemüte führen!

DataCool 8. Okt 2012 09:24

AW: dynamische Spaltenanzeige vom CxGrid
 
Hi Maya,

ist es auch. Versuch es mal mit :
<ColumnVarName>.Visible := true/false;

oder :
<GridTableViewName>.Columns["index der Spalte"].visible := true/false;

Alles klar ?

Greetz Data

P.S.: Bei DevExpress nicht verzagen, die Komponenten habe alle eine recht hohe Lernkurve,
aber wenn man erstmal richtig drin ist, ist es einfach nur geil
und der gute Support(wie oben schon erwähnt) hilft gerne und kompetent.

Maya 8. Okt 2012 09:43

AW: dynamische Spaltenanzeige vom CxGrid
 
Zitat:

Zitat von DataCool (Beitrag 1186194)
Hi Maya,

ist es auch. Versuch es mal mit :
<ColumnVarName>.Visible := true/false;

oder :
<GridTableViewName>.Columns["index der Spalte"].visible := true/false;

Mir geht's ja mehr darum, dass wenn an der DB-Tabelle was verändert wird, dass sofort im Programm sichtbar wird. D.h. dass der aus der Query herausliest, welche Spalten es alles gibt.

DataCool 8. Okt 2012 09:50

AW: dynamische Spaltenanzeige vom CxGrid
 
Hi Maya,

wenn ich Dich jetzt richtig verstehe möchtest Du gerne
die Spalten dynamisch zur Struktur der DB anpassen ?
Wenn ja müssen die Spalten dynamisch erzeugt werden.

Oder möchtest Du eine Änderung eines Datensatzes sofort erkennen ?

Greetz Data

franktron 8. Okt 2012 09:51

AW: dynamische Spaltenanzeige vom CxGrid
 
Das hier
TableView.DataController.CreateAllItems();

Maya 8. Okt 2012 10:52

AW: dynamische Spaltenanzeige vom CxGrid
 
Zitat:

Zitat von franktron (Beitrag 1186200)
Das hier
TableView.DataController.CreateAllItems();

Genau, genau, genau das wollte ich! Danke dir!


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:39 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz