CxGrid使用方法.doc_第1页
CxGrid使用方法.doc_第2页
CxGrid使用方法.doc_第3页
CxGrid使用方法.doc_第4页
CxGrid使用方法.doc_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

cxGrid的使用方法cxGrid功能强大,适合做企业级的复杂查询。非常方便。但是对其用法介绍的并不多,在此总结他人的使用经验和自己的一点小经验,供大家参考。()动态设置显示格式procedure SetDisplayFormat(ACtrlData: TClientDataSet; TbView: TcxGridDBTableView);var i: integer;begin if ACtrlData.RecordCount 0 then begin TNumericField(cxDBViewMaster.DataController.DataSet.Fieldsi).DisplayFormat := #,#0.000; Continue; end; if Pos(QUANTITY, UpperCase(cxDBViewMaster.DataController.DataSet.Fieldsi.FieldName) 0 then begin TNumericField(cxDBViewMaster.DataController.DataSet.Fieldsi).DisplayFormat := #,#0.000; Continue; end; if Pos(MONEY, UpperCase(cxDBViewMaster.DataController.DataSet.Fieldsi.FieldName) 0 then begin TNumericField(cxDBViewMaster.DataController.DataSet.Fieldsi).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.Columns0.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.Levels0.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.Levels0.GridView); GridView.DataController.KeyFieldNames := VendorID; GridView.OptionsView.GroupByBox := False; /显示主表内容 tvResult.BeginUpdate; tvResult.ClearItems; tvResult.DataController.CreateAllItems; tvResult.EndUpdate; /显示明细表内容 GridView := TcxGridDBTableView(cxGrid1.Levels0.Items0.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: 呵呵此楼回复Re: cxGrid比较不错,我也使用过导出到Excel,没有遇到你说的乱码 主从表也没有问题的,其实跟单表操作还不是一回事此楼回复Re: up此楼回复Re: 没用过cxGrid,以后考虑此楼回复Re: 楼主乃天人也! = Delphi下有cxGrid, .NET下有XtraGrid, 它们都是同一公司出的。 迟早都会转到.NET,所以。此楼回复Re: 路过此楼回复Re: 用过,挺好,只会使用最简单的。此楼回复Re: 发一个邮件给我,我把解决乱码后的源代码发一分给你,放到你的项目文件夹下即可。 此楼回复Re: 第二个问题:/Support/Center/default.aspx?view=ViewIssue&issueid=B2691此楼回复Re: 谢谢tttk(网络芝麻) 第二个问题:我现在直接让用户用导航条的删除/添加按钮了。根据你给的网址上的内容我知道大概该怎幺写了,有空再试试。 第一个问题:不光是乱码问题,还有从表内容没导出的问题。 只有一个表的话是不会出现乱码的。 第三个问题:还没来得及试。此楼回复Re: 第一个问题:看了一下帮助,原来cxGrid不支持主从表的导出,只能导出主表(顶层表)的内容。晕此楼回复Re: 贴一些小技巧,希望与各位使用cxGrid的朋友共同交流 各位有什幺好个技巧也可以贴出来: 技巧二:在内置右键菜单的后面增加菜单项 首先应在Form上加一个cxGridPopupMenu控件 以启用右键菜单 UseBuildInPopupMenus设为True procedure TFormItemList.FormCreate(Sender: TObject); var AMenu: TComponent; FMenuItem, FSubMenuItem: TMenuItem; begin AMenu := nil; if cxGridPopupMenu.BuiltInPopupMenus.Count = 0 then Exit; AMenu := cxGridPopupMenu.BuiltInPopupMenus0.PopupMenu; /第一个内置右键菜单(表头菜单) if Assigned(AMenu) and AMenu.InheritsFrom(TPopupMenu) then begin TPopupMenu(AMenu).AutoHotkeys := maManual; /手动热键 /- FMenuItem := TMenuItem.Create(Self); FMenuItem.Caption := -; FMenuItem.Name := miLineForGroup; TPopupMenu(AMenu).Items.Add(FMenuItem); /展开所有组 FMenuItem := TMenuItem.Create(Self); FMenuItem.Name := miExpandAllGroup; FMenuItem.Caption := 展开所有组(&X); FMenuItem.OnClick := miExpandAllGroupClick; TPopupMenu(AMenu).Items.Add(FMenuItem); /收缩所有组 FMenuItem := TMenuItem.Create(Self); FMenuItem.Name := miCollapseAllGroup; FMenuItem.Caption := 收缩所有组(&O); FMenuItem.OnClick := miCollapseAllGroupClick; TPopupMenu(AMenu).Items.Add(FMenuItem); /- FMenuItem := TMenuItem.Create(Self); FMenuItem.Caption := -; TPopupMenu(AMenu).Items.Add(FMenuItem); /过滤面板 FMenuItem := TMenuItem.Create(Self); FMenuItem.Name := miFilterPanel; FMenuItem.Caption := 过滤面板(&P); /自动显示 FSubMenuItem := TMenuItem.Create(Self); FSubMenuItem.Name := miFilterPanelAuto; FSubMenuItem.Caption := 自动(&A); FSubMenuItem.RadioItem := True; FSubMenuItem.GroupIndex := 5; /指定同一组 FSubMenuItem.Checked := True; FSubMenuItem.OnClick := miFilterPanelClick; FMenuItem.Add(FSubMenuItem); /加入二级子菜单 /总是显示 FSubMenuItem := TMenuItem.Create(Self); FSubMenuItem.Name := miFilterPanelAlways; FSubMenuItem.Caption := 总是显示(&W); FSubMenuItem.RadioItem := True; FSubMenuItem.GroupIndex := 5; FSubMenuItem.OnClick := miFilterPanelClick; FMenuItem.Add(FSubMenuItem); /从不显示 FSubMenuItem := TMenuItem.Create(Self); FSubMenuItem.Name := miFilterPanelNerver; FSubMenuItem.Caption := 从不显示(&N); FSubMenuItem.RadioItem := True; FSubMenuItem.GroupIndex := 5; FSubMenuItem.OnClick := miFilterPanelClick; FMenuItem.Add(FSubMenuItem); TPopupMenu(AMenu).Items.Add(FMenuItem); /自定义过滤 FMenuItem := TMenuItem.Create(Self); FMenuItem.Name := miCustomFilter; FMenuItem.Caption := 自定义过滤(&M); FMenuItem.OnClick := miCustomFilterClick; TPopupMenu(AMenu).Items.Add(FMenuItem); /过滤管理器 FMenuItem := TMenuItem.Create(Self); FMenuItem.Name := miFilterBuilder; TPopupMenu(AMenu).Images.AddImage(FormMain.ImageListExtend, 44); /添加图标图像 FMenuItem.ImageIndex := TPopupMenu(AMenu).Images.Count - 1; /指定图标序号 FMenuItem.Caption := 过滤管理器; FMenuItem.OnClick := Self.miFilterBuilderClick; TPopupMenu(AMenu).Items.Add(FMenuItem); /- FMenuItem := TMenuItem.Create(Self); FMenuItem.Caption := -; TPopupMenu(AMenu).Items.Add(FMenuItem); /导出 FMenuItem := TMenuItem.Create(Self); FMenuItem.Name := miExport; TPopupMenu(AMenu).Images.AddImage(FormMain.ImageListExtend, 37); FMenuItem.ImageIndex := TPopupMenu(AMenu).Images.Count - 1; FMenuItem.Caption := 导出(&E); FMenuItem.OnClick := Self.miExportClick; TPopupMenu(AMenu).Items.Add(FMenuItem); /打印 FMenuItem := TMenuItem.Create(Self); FMenuItem.Name := miPrint; FMenuItem.Caption := 打印(&P); TPopupMenu(AMenu).Images.AddImage(FormMain.ImageListExtend, 14); FMenuItem.ImageIndex := TPopupMenu(AMenu).Images.Count - 1; FMenuItem.OnClick := Self.miPrintClick; TPopupMenu(AMenu).Items.Add(FMenuItem); end; end; procedure TFormItemList.miExportClick(Sender: TObject); var FileName, FileExt, msg: String; begin if Self.aqyQuery.IsEmpty then begin msg := 没有导出数据.; Application.MessageBox(PChar(msg), PChar(Application.Title), MB_OK or MB_IconWarning); Exit; end; Self.SaveDialogExport.Filter := Excel文件 (*.xls)|*.xls|XML文件 (*.xml)|*.xml + |文本文件 (*.txt)|*.txt|网页文件 (*.html)|*.html; Self.SaveDialogExport.Title := 导出为; if not Self.SaveDialogExport.Execute then Exit; FileName := Self.SaveDialogExport.FileName; FileExt := LowerCase(ExtractFileExt(FileName); if FileExt = .xls then ExportGrid4ToExcel(FileName, Self.cxGrid1) else if FileExt = .xml then ExportGrid4ToXML(FileName, Self.cxGrid1) else if FileExt = .txt then ExportGrid4ToText(FileName, Self.cxGrid1) else if FileExt = .html then ExportGrid4ToHTML(FileName, Self.cxGrid1) else begin msg := 不支持的导出文件类型.; Application.MessageBox(PChar(msg), PChar(Application.Title), MB_OK or MB_IconError); Exit; end; msg := 导出完成.; Application.MessageBox(PChar(msg), PChar(Application.Title), MB_OK or MB_IconInformation); end; procedure TFormItemList.miPrintClick(Sender: TObject); begin /打印 Self.dxComponentPrinter.Preview(True, Self.dxComponentPrinterLink1); end; procedure TFormItemList.cxGridPopupMenuPopup(ASenderMenu: TComponent; AHitTest: TcxCustomGridHitTest; X, Y: Integer; var AllowPopup: Boolean); begin if GetHitTypeByHitCode(AHitTest.HitTestCode) = gvhtColumnHeader then /右击列标题时 begin /if tvResult.DataController.Groups.GroupingItemCount 0 then if tvResult.GroupedColumnCount 0 then /有分组时显示 begin TMenuItem(Self.FindComponent(miLineForGroup).Visible := True; TMenuItem(Self.FindComponent(miExpandAllGroup).Visible := True; TMenuItem(Self.FindComponent(miCollapseAllGroup).Visible := True; end else begin TMenuItem(Self.FindComponent(miLineForGroup).Visible := False; TMenuItem(Self.FindComponent(miExpandAllGroup).Visible := False; TMenuItem(Self.FindComponent(miCollapseAllGroup).Visible := False; end; end; end; procedure TFormItemList.miFilterBuilderClick(Sender: TObject); begin /过滤管理器 /弹出Filter Builder Dialog对话框 tvResult.Filtering.RunCustomizeDialog; end; procedure TFormItemList.miCustomFilterClick(Sender: TObject); var AHitTest: TcxCustomGridHitTest; begin /自定义过滤 /弹出Custom Filter Dialog对话框 AHitTest := cxGridPopupMenu.HitTest; if GetHitTypeByHitCode(AHitTest.HitTestCode) = gvhtColumnHeader then /获得右击的列 tvResult.Filtering.RunCustomizeDialog(TcxGridColumnHeaderHitTest(AHitTest).Column); end; procedure TFormItemList.miFilterPanelClick(Sender: TObject); var mi: TMenuItem; begin /隐藏/显示过滤面板 mi := TMenuItem(Sender); mi.Checked := True; if mi.Name = miFilterPanelAlways then tvResult.Filtering.Visible := fvAlways else if mi.Name = miFilterPanelNerver then tvResult.Filtering.Visible := fvNever else tvResult.Filtering.Visible := fvNonEmpty; end; procedure TFormItemList.miExpandAllGroupClick(Sender: TObject); begin /展开所有组 tvResult.DataController.Groups.FullExpand; end; procedure TFormItemList.miCollapseAllGroupClick(Sender: TObject); begin /收缩所有组 tvResult.DataController.Groups.FullCollapse; end; 此楼回复Re: 在用,留名此楼回复Re: 技巧三 按条件计算合计值 在Footer的第一列显示合计: 加一个Summary项,Column设为Grid的第一列,Kind设为skNone 在该Summary项的OnGetText事件中,输入: procedure TFormExpense.tvExpenseTcxGridDBDataControllerTcxDataSummaryFooterSummaryItems2GetText( Sender: TcxDataSummaryItem; const AValue: Variant; AIsFooter: Boolean; var AText: String); begin AText := 合计:; end; 按条件汇总: 在TableView的DataController-Summary-FooterSummary-OnSummary事件中,输入: procedure TFormExpense.tvExpenseDataControllerSummaryFooterSummaryItemsSummary( ASender: TcxDataSummaryItems; Arguments: TcxSummaryEventArguments; var OutArguments: TcxSummaryEventOutArguments); begin /得到字段名 TcxDBDataSummaryItem(Arguments.SummaryItem).FieldName; if (ASender.DataController.ValuesArguments.RecordIndex, tvExpenseLevel.Index 1) /只统计Level列=1的值 and (TcxDBDataSummaryItem(Arguments.SummaryItem).Kind = skSum) t

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论