Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
Delphi XE3 Enterprise
|
AW: dynamische Spaltenanzeige vom CxGrid
8. Okt 2012, 07:57
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;
Thomas Wassermann H₂♂ Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂♂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
|
|
Zitat
|