没有合适的资源?快使用搜索试试~ 我知道了~
DELPHI cxGrid的使用方法.doc和日常个人经验内容。
资源推荐
资源详情
资源评论
cxGrid 的使用方法
cxGrid 功能强大,适合做企业级的复杂查询。非常方便。
但是对其用法介绍的并不多,在此总结他人的使用经验和自己的一点小经验,供大家参考。
(1)动态设置显示格式
procedure SetDisplayFormat(ACtrlData: TClientDataSet;
TbView: TcxGridDBTableView);
var
i: integer;
begin
if ACtrlData.RecordCount <= 0 then Exit;
try
TbView.ClearItems;
ACtrlData.First;
for i := 0 to ACtrlData.RecordCount - 1 do
begin
if ACtrlData.FieldByName('SQBF_DisplayInGrid').AsString = '1' then //在表格中显示
with TbView.CreateColumn do
begin
DataBinding.FieldName := ACtrlData.FieldByName('SQBF_FieldName').AsString;
Caption := ACtrlData.FieldByName('SQBF_Caption').AsString; //字段中文标题
Hint := ACtrlData.FieldByName('SQBF_Hint').AsString;
Width := ACtrlData.FieldByName('SQBF_Width').AsInteger;
HeaderAlignmentHorz := taCenter;
end;
ACtrlData.Next;
end;
except
on E: Exception do
SaveLog('设置显示格式时出错:' + E.Message);
end;
end;
(2)显示行号
procedure TFmQueryBase.cxDBViewMasterCustomDrawIndicatorCell(
Sender: TcxGridTableView; ACanvas: TcxCanvas;
AViewInfo: TcxCustomGridIndicatorItemViewInfo; var ADone: Boolean);
var
FValue: string;
FBounds: TRect;
begin
FBounds := AViewInfo.Bounds;
if (AViewInfo is TcxGridIndicatorRowItemViewInfo) then
begin
ACanvas.FillRect(FBounds);
ACanvas.DrawComplexFrame(FBounds, clBlack, clBlack, [bBottom, bLeft, bRight], 1);
FValue := IntToStr(TcxGridIndicatorRowItemViewInfo(AViewInfo).GridRecord.Index+1);
InflateRect(FBounds, -3, -2); //Platform specific. May not work on Linux.
ACanvas.Font.Color := clBlack;
ACanvas.Brush.Style := bsClear;
ACanvas.DrawText(FValue, FBounds, cxAlignCenter or cxAlignTop);
ADone := True;
end;
end;
( 3 ) 设 置 显示 格 式 , 我 的 项 目 要 求 先 动 态 添 加 字 段 , 这 时 不 知 道 字 段 类 型 , 所 以 设 置
DisplayFormat 不方便,我还没有找到好方法。
所以采用打开数据集后再设置:
procedure TFmQueryBase.cdsMasterAfterOpen(DataSet: TDataSet);
var
i: Integer;
begin
for i := 0 to cxDBViewMaster.DataController.DataSet.FieldCount -1 do
begin
if cxDBViewMaster.DataController.DataSet.Fields[i] is TNumericField then
begin
if Pos('AMOUNT', UpperCase(cxDBViewMaster.DataController.DataSet.Fields[i].FieldName)) > 0 then
begin
TNumericField(cxDBViewMaster.DataController.DataSet.Fields[i]).DisplayFormat := '#,##0.000';
Continue;
end;
if Pos('QUANTITY', UpperCase(cxDBViewMaster.DataController.DataSet.Fields[i].FieldName)) > 0 then
begin
TNumericField(cxDBViewMaster.DataController.DataSet.Fields[i]).DisplayFormat := '#,##0.000';
Continue;
end;
if Pos('MONEY', UpperCase(cxDBViewMaster.DataController.DataSet.Fields[i].FieldName)) > 0 then
begin
TNumericField(cxDBViewMaster.DataController.DataSet.Fields[i]).DisplayFormat := '#,##0.00';
Continue;
end;
end;
end;
end;
最近在学习使用 cxGrid,安装的版本是 ExpressQuantumGrid Suite v5.10
我发现这个控件功能虽然强大,但是非常难用。
现在我手头就有几个问题还没解决:
1)主从模式下导出 Excel 中文会产生乱码,而且从表内容没有导出。
我不知道是不是因为我的字段名包括单引号的原因。
导出代码:ExportGrid4ToExcel(FileName, cxGrid);
2)主从模式下通过按钮对从表添加/删除行,代码怎幺写。
附:单表添加/删除行的代码
procedure TFormAccount.cxButtonNewClick(Sender: TObject);
begin
Self.tvAccount.DataController.Append;
Self.tvAccount.Columns[0].Focused := True;
cxGrid.SetFocus;
end;
procedure TFormAccount.cxButtonDeleteClick(Sender: TObject);
begin
if Self.tvAccount.DataController.RowCount = 0 then
Exit;
if Application.MessageBox('确认删除当前记录?', '确认删除',
MB_YesNo + MB_IconQuestion) = IDNO then
Exit;
Self.tvAccount.DataController.DeleteFocused;
end;
3)动态创建主从结构出错(Compiler 没错,运行时出现系统错误 0000000018),
我使用了二个 ADOStoreProcedure 作主从表
代码如下:
var
Level: TcxGridLevel;
GridView: TcxGridDBTableView;
begin
Level := cxGrid1.Levels[0].Add;
GridView := TcxGridDBTableView(cxGrid1.CreateView(TcxGridDBTableView));
GridView.DataController.DataSource := Self.dsDetail;
GridView.DataController.KeyFieldNames := 'PurchOrderID;POLineNbr;PromiseDate;ReceiverDate';
GridView.DataController.MasterKeyFieldNames := 'VendorID';
GridView.DataController.DetailKeyFieldNames := 'VendorID';
GridView.DataController.DataModeController.SmartRefresh := True;
GridView.OptionsCustomize.ColumnHiding := True;
GridView.OptionsCustomize.ColumnsQuickCustomization := True;
GridView.OptionsData.Deleting := False;
GridView.OptionsData.Inserting := False;
GridView.OptionsView.Indicator := True;
Level.GridView := GridView;
GridView := TcxGridDBTableView(cxGrid1.Levels[0].GridView);
GridView.DataController.KeyFieldNames := 'VendorID';
GridView.OptionsView.GroupByBox := False;
//显示主表内容
tvResult.BeginUpdate;
tvResult.ClearItems;
tvResult.DataController.CreateAllItems;
tvResult.EndUpdate;
//显示明细表内容
GridView := TcxGridDBTableView(cxGrid1.Levels[0].Items[0].GridView);
GridView.BeginUpdate;
GridView.ClearItems;
GridView.DataController.CreateAllItems;
GridView.DataController.Refresh;
GridView.EndUpdate;
end;
此楼回复 Re:
小技巧:用代码展开/收缩主从结构
Self.tvDepartment.ViewData.Expand(True);
Self.tvDepartment.ViewData.Collaspe(True);
注:tvDepartment 为主表对应的 TableView
此楼回复 Re:
你说的这几个问题我也遇到过。
第一个问题是编码的问题,修改了其中关于编码的函数,OK.
第二个问题在 cxGrid 的社区可以找到解答,但从表必须满足某种条件,例如关键字排序。
第三个问题的解决办法,你可以尝试在动态创建的代码前后加上:
grid.beginupdate;
...
grid.endupdate
来解决。
此楼回复 Re:
没用过
不要经常使用三方控件
此楼回复 Re:
to tttk(网络芝麻):
第一个问题:如何修改啊,贴出代码
第二个问题:没搜到啊
第三个问题:试一下再说
此楼回复 Re:
不要经常使用三方控件
======================
我感觉不用 cxGrid 的话,没必要用 Delphi 了,呵呵
此楼回复 Re:
楼上这话是不是有点问题?DELPHI 能做得事情很多很多,难道非要用 CXGRID?CXGRID 不是用 DELPHI 做出来得?
此楼回复 Re:
没用过.....
此楼回复 Re:
回复人: zxkid(没有人会像我这样...) ( ) 信誉:101 2006-01-06 16:58:00 得分: 0
不要经常使用三方控件
======================
我感觉不用 cxGrid 的话,没必要用 Delphi 了,呵呵
**********
楼主乃天人也!!
此楼回复 Re:
剩余63页未读,继续阅读
资源评论
BALLCHAN1
- 粉丝: 0
- 资源: 9
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功