您的位置:首页 > 其它

cxGrid使用汇总3

2013-04-04 10:08 579 查看
32根据单元的值设置样式

解决:

procedure <aForm>.<aColumn>StylesGetContentStyle(

Sender: TcxCustomGridTableView; ARecord: TcxCustomGridRecord;

AItem: TcxCustomGridTableItem; out AStyle: TcxStyle);

begin

if ARecord.Values[AItem.Index] = aSomeValue then

AStyle := <aSomeStyle>;

end;

procedure <aForm>.<aView>StylesGetContentStyle(

Sender: TcxCustomGridTableView; ARecord: TcxCustomGridRecord;

AItem: TcxCustomGridTableItem; out AStyle: TcxStyle);

var

AColumn: TcxCustomGridTableItem;

begin

AColumn := (Sender as TcxGridDBTableView).GetColumnByFieldName('Email');

if VarToStr(ARecord.Values[AColumn.Index]) = '' then

AStyle := cxStyleNullEmail;

end;

======================================================================

TcxCustomGridTableView.FindItemByName, TcxGridDBTableView.GetColumnByFieldName or

TcxGridDBDataController.GetItemByFieldName

with cxGrid1DBBandedTableView1.DataController do

AValue := Values[FocusedRecordIndex, GetItemByFieldName('SomeFieldName').Index];

****************************************************************************

33动态生成BandedView

解决:

var

AView: TcxCustomGridView;

begin

AView := <cxGrid>.CreateView(TcxGridDBBandedTableView);

TcxGridDBBandedTableView(AView).DataController.DataSource := <DataSource>;

TcxGridDBBandedTableView(AView).Bands.Add;

with TcxGridDBBandedTableView(AView).Bands.Add do

begin

Visible := False;

FixedKind := fkLeft;

end;

TcxGridDBBandedTableView(AView).DataController.CreateAllItems;

<cxGridLevel>.GridView := AView;

end;

****************************************************************************

34当底层数据集为空时显示一条空记录

解决:

procedure <Form>.<cxGrid>Enter(Sender: TObject);

var

View: TcxGridDBTableView;

begin

View := TcxGridDBTableView((Sender as TcxGrid).FocusedView);

if View.DataController.DataSet.IsEmpty then

begin

View.DataController.DataSet.Append;

View.Controller.EditingController.ShowEdit;

end;

end;

****************************************************************************

35 在当前View插入记录

解决:

使用FocusedView属性得到当前焦点View,用View.DataController得到对应的Data Controller,

之后使用Data Controller的方法来操作数据:

- Append

- Insert

- Post

- Cancel

- DeleteFocused

- DeleteSelection

示例:

var

ARecIndex: Integer;



View.DataController.Append;

ARecIndex := View.DataController.FocusedRecordIndex;

View.DataController.Values[ARecIndex, SomeItemIndex] := SomeValue;

View.DataController.Post;

另外一种方法是使用View.DataController.DataSource.DataSet得到底层数据集后,再用数据集的方法来操作数据。

****************************************************************************

36激活内置编辑控件

解决:

1) <aView>.Controller.EditingController.ShowEdit(<aColumn>);

2) <aView>.Controller.EditingController.StartEditShowingTimer(<aColumn>);

3) <aView>.Controller.EditingItem := <aColumn>;

4) <aColumn>.Editing := True;

****************************************************************************

37隐藏内置编辑控件

解决:

<aView>.Controller.EditingController.HideEdit(True);

****************************************************************************

38 移除一个分组列

解决:

<aColumn>.GroupIndex := -1;

<aColumn>.Visible := True;

****************************************************************************

39 保存修改到数据库

解决:

procedure <aForm>.FormClose(Sender: TObject; var Action: TCloseAction);

begin

if (<aGrid>.FocusedView <> nil)

and (<aGrid>.FocusedView.DataController.EditState <> []) then

<aGrid>.FocusedView.DataController.Post;

end;

****************************************************************************

40设置内置右键菜单

解决:

内置右键菜单包括二个菜单:cxGridStdHeaderMenu, TcxGridStdFooterMenu

uses cxGridStdPopupMenu;

procedure TForm1.cxGridPopupMenu1Popup(ASenderMenu: TComponent;

AHitTest: TcxCustomGridHitTest; X, Y: Integer; var AllowPopup: Boolean);

begin

if ASenderMenu is TcxGridStdHeaderMenu then

TcxGridStdHeaderMenu(ASenderMenu).OnPopup := StdHeaderMenuPopup;

end;

procedure TForm1.StdHeaderMenuPopup(Sender: TObject);

var

I: Integer;

begin

with TcxGridStdHeaderMenu(Sender).Items do

for I := 0 to Count - 1 do

if Items[I].Caption = 'Group By Box' then

begin

Items[I].Enabled := False;

System.Break;

end

end;

****************************************************************************

41得到选中记录的值

解决:

1) View.DataController.DataModeController.GridMode = False时

RecIdx := View.Controller.SelectedRecords[i].RecordIndex;

ColIdx := View.DataController.GetItemByFieldName(AFieldName).Index;

OutputVal := View.DataController.Values[RecIdx, ColIdx];

//RecID := View.DataController.GetRecordId(RecIdx);

//OutputVal := ADataSet.Lookup(View.DataController.KeyFieldNames, RecID, AFieldName);

2) View.DataController.DataModeController.GridMode = True时

Bkm := View.DataController.GetSelectedBookmark(ASelectedRecordIndex);

if ADataSet.BookmarkValid(TBookmark(Bkm)) then

begin

ADataSet.Bookmark := TBookmark(Bkm);

OutputVal := ADataSet.FieldByName(AFieldName).Value;

end;

View.BeginUpdate;

View.DataController.BeginLocate;

try

// make changes here…

finally

View.DataController.EndLocate;

View.EndUpdate;

end;

****************************************************************************

42在GridMode禁用内置的右键Footer菜单

解决:

uses cxGridStdPopupMenu;

procedure cxGridPopupMenuOnPopup(...)

begin

if (ASenderMenu is TcxGridStdFooterMenu) and

<GridView>.DataController.DataModeController.GridMode then

AllowPopup := False;

end;

****************************************************************************

43主从表任何时候只能展开一个组

解决:

procedure TForm1.ADetailDataControllerCollapsing(

ADataController: TcxCustomDataController; ARecordIndex: Integer;

var AAllow: Boolean);

var

I: Integer;

C: Integer;

begin

AAllow := False;

C := 0;

for I := 0 to ADataController.RecordCount - 1 do

begin

if ADataController.GetDetailExpanding(I) then

Inc(C);

if C > 1 then

AAllow := True;

end;

end;

procedure TForm1.ADetailDataControllerExpanding(

ADataController: TcxCustomDataController; ARecordIndex: Integer;

var AAllow: Boolean);

begin

ADataController.CollapseDetails;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin cxGrid1DBTableView1.DataController.OnDetailExpanding:=ADetailDataControllerExpanding; cxGrid1DBTableView1.DataController.OnDetailCollapsing:=ADetailDataControllerCollapsing;

end;

****************************************************************************

44动态创建层次(Level)和视图(View)

解决:

var

Grid: TcxGrid;

Level: TcxGridLevel;

View: TcxGridDBTableView;

begin

// Creates a Grid instance

Grid := TcxGrid.Create(SomeOwner);

Grid.Parent := SomeParent;

// Creates a Level

Level := Grid.Levels.Add;

Level.Name := 'SomeLevelName';

// Creates a View

View := Grid.CreateView(TcxGridDBTableView) as TcxGridDBTableView;

View.Name := 'SomeViewName';

// … and binds it to the Level

Level.GridView := View;

// Hooks up the View to the data

View.DataController.DataSource := SomeDataSource;

// … and creates all columns

View.DataController.CreateAllItems;

end;

****************************************************************************

45获得Group Footer合计行对应的记录

解决:

procedure TForm1.cxGrid1DBTableView1CustomDrawFooterCell(

Sender: TcxGridTableView; ACanvas: TcxCanvas;

AViewInfo: TcxGridColumnHeaderViewInfo; var ADone: Boolean);

var

ALevel, ADataGroupIndex: Integer;

AGridRecord, AGroupRecord: TcxCustomGridRecord;

begin

if AViewInfo is TcxGridRowFooterCellViewInfo and // Row footer

(TcxGridDBColumn(AViewInfo.Column).DataBinding.FieldName = 'Area') then // Area column

begin

AGridRecord:= TcxGridRowFooterCellViewInfo(AViewInfo).GridRecord;

ALevel:= TcxGridRowFooterCellViewInfo(AViewInfo).Container.GroupLevel;

ADataGroupIndex:=Sender.DataController.Groups.DataGroupIndexByRowIndex[AGridRecord.Index];

if ADataGroupIndex <> -1 then

begin

AGroupRecord := AGridRecord;

while AGroupRecord.Level <> ALevel do

AGroupRecord := AGroupRecord.ParentRecord;

AViewInfo.Text := AGroupRecord.DisplayTexts[0];

end;

end;

end;

****************************************************************************

46访问过滤之后的记录

解决:

var

I: Integer;

begin

Memo1.Lines.Clear;

with cxGrid1DBTableView1.DataController do

for I := 0 to FilteredRecordCount - 1 do

Memo1.Lines.Add(DisplayTexts[FilteredRecordIndex[I], 0]);

end;

****************************************************************************

47获得单元的Font

解决:

cxGrid1DBTableView1.ViewInfo.RecordsViewInfo.Items[1].GetCellViewInfoByItem(

cxGrid1DBTableView1Company).EditViewInfo.Font;

****************************************************************************

48根据Level名称找到Level对象

解决:

function GetLevelByName(AGrid: TcxGrid; ALevelName: string): TcxGridLevel;

function LoopThroughLevels(ALevel: TcxGridLevel; ALevelName: string): TcxGridLevel;

var

I: Integer;

begin

Result := nil;

for I := 0 to ALevel.Count - 1 do

begin

if ALevel[I].Name = ALevelName then

begin

Result := ALevel[I];

Exit;

end;

if ALevel[I].Count > 0 then

begin

Result := LoopThroughLevels(ALevel[I], ALevelName);

if Result <> nil then

Exit;

end;

end;

end;

var

I: Integer;

begin

Result := nil;

for I := 0 to AGrid.Levels.Count - 1 do

begin

if AGrid.Levels[I].Name = ALevelName then

begin

Result := AGrid.Levels[I];

Exit;

end;

if AGrid.Levels[I].Count > 0 then

begin

Result := LoopThroughLevels(AGrid.Levels[I], ALevelName);

if Result <> nil then

Exit;

end;

end;

end;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: