使用cxGrid有一些时间了
在这里总结一下使用cxGrid的一些方法
希望给刚开始接触cxGrid的人一些帮助
简单介绍cxGrid右下方的cxGridLevel是表示Grid表的层cxGrid可以有多层这相当于集合了PageControl的功能而cxGridLevel右边的cxGridDBTableView相当于DBGrid一样右击cxGrid可以添加cxGridLevel右击cxGridLevel可以选择Create View Add level 或者Delete LevelAdd level可以增加子LevelCreate View里面可以选择很多不同总类的View其中
)DB Table可以和数据库连接的View更一般的DBGrid类似它比DBGrid多了比如鼠标中键可以用可以统计查询等等功能
)DB Banded Table 则可以实现比如
| 说明 | 说明 |
| 字段 | 字段 | 字段 | 字段 |
等类似的功能
)DB Card View 则提供了卡片方式的显示数据的功能这个用在比如人事档案管理比较不错
)其它不一一赘述
一些使用方法
)有图片和MEMO的例子
拖入一个cxGridTableDataSource
Table的DatabaseName设为DBDEMOSTableName设为biolifedbActive设为True;
DataSource的DataSet设为Table
cxGridDBTableView的DataController中的DataSource 设为DataSource;
右击cxGridDBTableView选择Create All Columns
双击cxGrid在弹出的窗口中找到 cxGridDBTableViewNotes和cxGridDBTableViewGraphic将它们的Properties属性设为BlobEdit
运行看看结果
再将cxGridDBTableViewGraphic的Properties属性设为Image再将Properties下的Stretch设为True将cxGridDBTableView>optionsview>CellAutoHeight 设为True看看结果
)如何让Drag a column here to group by that column不显示
解决点击cxGrid上的cxGridDBTableView
在cxGridDBTableView>optionsview>groupbybox:=false即可
注OptionsView里面有很多属性可能经常要用比如ColumnAutoWithNavigator等等慢慢琢磨吧:)
)GroupPanel上面的英文[Drag a column header to group by that column]怎么可以改成中文?
解决最简单的方法是 TcxGridTableViewOnCustomDrawPartBackground 也可用OnCustomDrawGroupCell
procedure TFormcxGridDBTableViewCustomDrawPartBackground(Sender: TcxGridTableView; ACanvas: TcxCanvas;AViewInfo: TcxCustomGridCellViewInfo; var ADone: Boolean);
begin
AViewInfoText:=动态设置 GroupBox 的显示内容;
ACanvasFillRect(AViewInfoBounds);
end;
)如何实现如下功能
+财务部
+原材料仓库
+成品库
+沖压车间
+软件开发部
这个是部门的名称点击加号就可以将本部门的人员情况显示出来
解决其实这是一个主从表关系
填好主表的keyfieldnames
填好从表的keyfieldnames
填好从表的detaikeyfieldNames与masterkeyfieldnames
: 从表的数据源一定要按与主表关联的字段排序
注其它地方设置了主从表结构那样就显示不出来比如设置了从表的Table或者Query的mastersource和asterfield就会不能显示数据!如果是两个cxGrid的主从关系这样设置就很OK了
)统计功能
解决cxGridDBTableView>optionsview>Footer 设为True
cxGridDBTableView>DataController>Summary设置FooterSummaryItems即可
)类似PageControl显示
解决增加一个Level将cxGrid>RootLevelOptions>DetailTabsPosition设为dtpTop然后相应的设置cxGridLevel和cxGridLevel的Caption值
)如何设定左边几列不能滚动?
解决使用DB Banded Table才可以实现
在cxGridDBBandedTableView里建立BandBand
Band的Fixed=tfLeft
Band的Fixed=tfnone
设置要锁定的字段的BandIndex=其它为就OK了
)怎样实现如EXCEL一样的当前格=G+G+G 这样的功能
解决举一个简单的例子
labelCaption := cxGridDBTableViewDataControllerValues[] + cxGridDBTableViewDataControllerValues[] + cxGridDBTableViewDataControllerValues[ ];
所以不同cxGridDBTableView中的数据都可以给当前格这样就做到了EXCEL中的当前格=G+G+G 类似的功能
)鼠标右击cxGridDBBandedTableView菜单里的Edit Layout什么用怎么使用?
解决可以拖动字段并列的可以拖成有层次感(一层层) 拖动时会显示箭头的就是说可以拖一个字段放到最上面就可以使记录按此字段进行分组点击其中一个字段上面还会出现一个上升或者下降的小三角形这个小三角形的作用是在运行阶段数据就会按照这个字段上升或者下降排序还有一个Set as Default的作用是保持当前TableView的参数下此产生新的TableView的时候就会可以和上次保持的参数一样
)怎样将cxGrid里的数据导入到EXCELHTMLXML和TEXT
解决这个问题在用了cxGrid以后变得异常简单
uses
cxExportGridLink;
procedure TFormButtonClick(Sender: TObject);
begin
ExportGridToEXCEL(d:\wangxslcxGridTrueTrue);
ExportGridToTEXT(d:\wangtxtcxGridTrueTrue);
ExportGridToXML(d:\wangxmlcxGridTrueTrue);
ExportGridToHTML(d:\wanghtmlcxGridTrueTrue);
end;
)如何使满足条件的数据显示不同的颜色?
解决
var
AYellowStyle: TcxStyle;
procedure TFormFormCreate(Sender: TObject);
begin
//行颜色
AYellowStyle := TcxStyleCreate(Self);
AYellowStyleColor := $FFFF;
AYellowStyleTextColor := clMaroon;
end;
procedure TFormcxGridDBBandedTableViewStylesGetContentStyle(
Sender: TcxCustomGridTableView; ARecord: TcxCustomGridRecord;
Item: TcxCustomGridTableItem; out AStyle: TcxStyle);
begin
if ARecordValues[cxGridDBBandedTableViewLengthcmIndex] < then
AStyle := AYellowStyle;
end;
这里cxGridDBBandedTableViewLengthcmIndex小于时就显示黄色
问题)如何从外边的TXT文件导入到cxGrid?
解决procedure CustomizeColumns;
procedure LoadData;
procedure TFormCustomizeColumns;
const
cDistance = ;
cRadius = ;
cPeriod = ;
cPstring = ;
var
I: Integer;
begin
DecimalSeparator := ;
with cxGridTableView do
for I := to ColumnCount do
if I in [cDistance cRadius] then
Columns[I]DataBindingValueTypeClass := TcxIntegerValueType
//列为Integer
else
if I in [cPstringcPeriod] then
Columns[I]DataBindingValueTypeClass := TcxStringValueType
//列为String
else
Columns[I]DataBindingValueTypeClass := TcxFloatValueType;
//其他为Float
end;
procedure TFormLoadData;
const
AFileName = 资产负债表txt;
AHeaderLineCount = ;
var
ARecords AValues: TStringList;
I: Integer;
procedure InitRecord(const Str: string);
var
J: Integer;
V: Variant;
begin
AValuesCommaText := Str;
for J := to AValuesCount do
if AValuesStrings[J] <> then
begin
V := AValuesStrings[J];
if not VarIsNull(V) then
cxGridTableViewDataControllerValues[I J] := V;
end;
end;
begin
if not FileExists(AFileName) then
raise ExceptionCreate(Data file not found);
ARecords := TStringListCreate;
AValues := TStringListCreate;
with ARecords do
try
LoadFromFile(AFileName);
cxGridTableViewBeginUpdate;
cxGridTableViewDataControllerRecordCount := Count AHeaderLineCount;
for I := to Count (AHeaderLineCount + ) do
InitRecord(Strings[I + AHeaderLineCount]);
finally
cxGridTableViewEndUpdate;
ARecordsFree;
AValuesFree;
end;
end;
procedure TFormFormCreate(Sender: TObject);
begin
CustomizeColumns;
LoadData_Zcfz;
end;
其中资产负债表txt中的数据如下
资 产 行次 年初数 期末数 负债及所有者权益 行次 年初数 期末数
流动资产 流动负债
)如何改变列的颜色?
var
AFirstColumnStyle: TcxStyle;
procedure TFormFormCreate(Sender: TObject);
begin
//列颜色
AFirstColumnStyle := TcxStyleCreate(Self);
AFirstColumnStyleColor := clAqua;
AFirstColumnStyleTextColor := clBlue;
cxGridTableViewColumns[]StylesContent := AFirstColumnStyle;
end;
)Set as default的用法?
解决Set as default的用法是为了解决设置参数的方便而做的比如
连好数据库以后更改cxGridDBBandedTableView>OptionsCustomize>ColumnFiltering 设为False(这个设置可以将字段名的下拉单给去掉)更改cxGridDBBandedTableView>OptionsView>Navigator 设置为True然后右击cxGridDBBandedTableView在弹出的菜单栏里面点击Set as default
OK下次你再产生一个新的cxGridDBBandedTableView时这些设置和刚才的一样了如果需要设置的参数很多的时候这个Set as default很有用!
)怎样使鼠标移动时相应的单元格里的文字变色?
解决
var
FTrackItem: TcxCustomGridTableItem;
FTrackRec: TcxCustomGridRecord;
procedure TFormcxGridDBTableViewCustomDrawCell(
Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
begin
if (AViewInfoGridRecord = FTrackRec) and (AViewInfoItem = FTrackItem) then
begin
ACanvasFontColor := clred; //红色字体
ACanvasFontStyle := [fsUnderline];//带下划线
end;
end;
procedure TFormcxGridDBTableViewMouseMove(Sender: TObject;
Shift: TShiftState; X Y: Integer);
var
AHitTest: TcxCustomGridHitTest;
ATrackItem: TcxCustomGridTableItem;
ATrackRec: TcxCustomGridRecord;
begin
ATrackItem := FTrackItem;
ATrackRec := FTrackRec;
AHitTest := (Sender as TcxGridSite)GridViewViewInfoGetHitTest(X Y);
if AHitTest is TcxGridRecordCellHitTest then
begin
FTrackItem := TcxGridRecordCellHitTest(AHitTest)Item;
FTrackRec := TcxGridRecordCellHitTest(AHitTest)GridRecord;
end
else
begin
FTrackItem := nil;
FTrackRec := nil;
end;
if (ATrackItem <> FTrackItem) or (ATrackRec <> FTrackRec) then
begin
// Invalidate old cell
if ATrackRec <> nil then
ATrackRecInvalidate(ATrackItem);
// Invalidate new cell
if FTrackRec <> nil then
FTrackRecInvalidate(FTrackItem);
end;
end;
)怎样设计多表头的cxGrid?
解决cxGrid可以解决如下的表头
| 说明 | 说明 |
| 字段 | 字段 | 字段 | 字段 |
|字段|字段 |
|字段| 字段 | 字段 |
实现这个很简单你可以直接在上面拖动字段名拖动时会显示箭头的放入你想显示的位置就OK了或者在鼠标右击cxGridDBBandedTableView菜单里的Edit Layout里也可以拖放
但是cxGrid不能实现如下的多表头形式
| 说明 | 说明 |
| 说明 | 说明 | 说明 | 说明 |
| 字段 | 字段 |
| 字段 | 字段 | 字段 |
不知道有谁能实现这样的多表头?
)在主从表结构时当点开+时怎样将焦点聚在相应主表的记录上?
解决
var
HitTest: TcxCustomGridHitTest;
procedure TColumnsShareDemoMainFormtvProjectsMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X Y: Integer);
begin
// Note that the Sender parameter is a Site
HitTest := (Sender as TcxGridSite)GridViewViewInfoGetHitTest(X Y);
// The point belongs to the [+]/[] button area
if HitTest is TcxGridExpandButtonHitTest then
// Move focus to the record
TcxGridExpandButtonHitTest(HitTest)GridRecordFocused := True;
end;
以上是在用cxGrid时候碰到的一些问题我总结了一部分还有很多问题等待解决在这里我希望用过cxGrid的人帮着一起总结一下让后学者可以少走点弯路!