Delphi 控件cxGrid技巧汇总.doc_第1页
Delphi 控件cxGrid技巧汇总.doc_第2页
Delphi 控件cxGrid技巧汇总.doc_第3页
Delphi 控件cxGrid技巧汇总.doc_第4页
Delphi 控件cxGrid技巧汇总.doc_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

Delphi 控件cxGrid技巧汇总2009-04-01 12:48 = 在主从TableView中根据主TableView得到对应的从TableView var ADetailDC: TcxGridDataController; AView: TcxCustomGridTableView; begin with cxGrid1DBTableView1.DataController do ADetailDC := TcxGridDataController(GetDetailDataController(FocusedRecordIndex, 0); AView := ADetailDC.GridView; end; = 定位在第一行并显示内置编辑器 cxDBVerticalGrid1.FocusedRow := cxDBVerticalGrid1.Rows0; cxDBVerticalGrid1.ShowEdit; = 隐藏 字符串 该文本存储在scxGridNoDataInfoText资源字符串,可以将该资源字符串的内容设为空 来隐藏该文本。 uses cxClasses, cxGridStrs; . cxSetResourceString(scxGridNoDataInfoText, ); /如果 字符串已经显示,需要调用: .LayoutChanged; = 删除应用过滤后的行 var I: Integer; begin with do for I := 0 to ViewData.RecordCount - 1 do begin ViewData.Records0.Focused := True; DataController.DataSet.Delete; end; = 根据单元的值设置样式 procedure .StylesGetContentStyle( Sender: TcxCustomGridTableView; ARecord: TcxCustomGridRecord; AItem: TcxCustomGridTableItem; out AStyle: TcxStyle); begin if ARecord.ValuesAItem.Index = aSomeValue then AStyle := ; end; procedure .StylesGetContentStyle( Sender: TcxCustomGridTableView; ARecord: TcxCustomGridRecord; AItem: TcxCustomGridTableItem; out AStyle: TcxStyle); var AColumn: TcxCustomGridTableItem; begin AColumn := (Sender as TcxGridDBTableView).GetColumnByFieldName(Email); if VarToStr(ARecord.ValuesAColumn.Index) = then AStyle := cxStyleNullEmail; end; = TcxCustomGridTableView.FindItemByName, TcxGridDBTableView.GetColumnByFieldName or TcxGridDBDataController.GetItemByFieldName with cxGrid1DBBandedTableView1.DataController do AValue := ValuesFocusedRecordIndex, GetItemByFieldName(SomeFieldName).Index; = 动态生成BandedView var AView: TcxCustomGridView; begin AView := .CreateView(TcxGridDBBandedTableView); TcxGridDBBandedTableView(AView).DataController.DataSource := ; TcxGridDBBandedTableView(AView).Bands.Add; with TcxGridDBBandedTableView(AView).Bands.Add do begin Visible := False; FixedKind := fkLeft; end; TcxGridDBBandedTableView(AView).DataController.CreateAllItems; .GridView := AView; = 当底层数据集为空时显示一条空记录 procedure .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; = 在当前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.ValuesARecIndex, SomeItemIndex := SomeValue; View.DataController.Post; 另外一种方法是使用View.DataController.DataSource.DataSet得到底层数据集后,再用数据集的 方法来操作数据。 = 激活内置编辑控件 1) .Controller.EditingController.ShowEdit(); 2) .Controller.EditingController.StartEditShowingTimer(); 3) .Controller.EditingItem := ; 4) .Editing := True; 隐藏内置编辑控件 .Controller.EditingController.HideEdit(True); = 移除一个分组列 .GroupIndex := -1; .Visible := True; = 保存修改到数据库 procedure .FormClose(Sender: TObject; var Action: TCloseAction); begin if (.FocusedView nil) and (.FocusedView.DataController.EditState ) then .FocusedView.DataController.Post; end; = 设置内置右键菜单 内置右键菜单包括二个菜单: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 ItemsI.Caption = Group By Box then begin ItemsI.Enabled := False; System.Break; end end; = 得到选中记录的值 1) View.DataController.DataModeController.GridMode = False时 RecIdx := View.Controller.SelectedRecordsi.RecordIndex; ColIdx := View.DataController.GetItemByFieldName(AFieldName).Index; OutputVal := View.DataController.ValuesRecIdx, 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; = 在GridMode禁用内置的右键Footer菜单 uses cxGridStdPopupMenu; procedure cxGridPopupMenuOnPopup(.) begin if (ASenderMenu is TcxGridStdFooterMenu) and .DataController.DataModeController.GridMode then AllowPopup := False; end; = 主从表任何时候只能展开一个组 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; = 动态创建层次(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;= 获得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.DataGroupIndexByRowIndexAGridRecord.Index; if ADataGroupIndex -1 then begin AGroupRecord := AGridRecord; while AGroupRecord.Level ALevel do AGroupRecord := AGroupRecord.ParentRecord; AViewInfo.Text := AGroupRecord.DisplayTexts0; end; end; end; = 访问过滤之后的记录 var I: Integer; begin Memo1.Lines.Clear; with cxGrid1DBTableView1.DataController do for I := 0 to FilteredRecordCount - 1 do Memo1.Lines.Add(DisplayTextsFilteredRecordIndexI, 0); end; = 获得单元的Font cxGrid1DBTableView1.ViewInfo.RecordsViewInfo.Items1.GetCellViewInfoByItem( cxGrid1DBTableView1Company).EditViewInfo.Font; = 根据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 ALevelI.Name = ALevelName then begin Result := ALevelI; Exit; end; if ALevelI.Count 0 then begin Result := LoopThroughLevels(ALevelI, 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.LevelsI.Name = ALevelName then begin Result := AGrid.LevelsI; Exit; end; if AGrid.LevelsI.Count 0 then begin Result := LoopThroughLevels(AGrid.LevelsI, ALevelName); if Result nil then Exit; end; end; end; = 指定Filter Builder打开/保存过滤文件的默认路径 uses ., cxFilterControlDialog; procedure TForm.GridView1FilterControlDialogShow( Sender: TObject); begin TfmFilterControlDialog(Sender).OpenDialog.InitialDir := D: end; = 保存/恢复带汇总行的布局 .StoreToIniFile(c:Grid.ini, True, gsoUseSummary); .RestoreFromIniFile(,True,False or True, optional,gsoUseSummary); = 取消过滤时移到第一行 uses cxCustomData; procedure TYour_Form.AViewDataControllerFilterChanged(Sender: TObject); var Filter: TcxDataFilterCriteria; begin with Sender as TcxDataFilterCriteria do if IsEmpty then DataController.FocusedRowIndex := 0; end; = 排序后移到第一行 可以设置DataController.Options.FocusTopRowAfterSorting := True,也可以使用如下的代码: uses cxCustomData; procedure TYour_Form.Your_ViewDataControllerSortingChanged(Sender: TObject); begin TcxCustomDataController(Sender).FocusedRowIndex := 0; end; = 判断当前行是否第一行或最后一行 可以使用DataController的IsBOF, IsEOF方法,或者: .Controller.Controller.FocusedRow.IsFirst .Controller.Controller.FocusedRow.IsLast = 根据指定值查找记录 DataController提供了好几个方法来得到指定值对应的RecordIndex 对于Bound View可以使用FindRecordIndexByKeyValue方法 = 编辑和显示Blob字段 该字段的Properties设置为BlobEdit,并将BlobPaintStyle 属性设为 bpsText = 得到可见行数 .ViewInfo.VisibleRecordCount = 保存后的行设置为当前行 const CM_SETFOCUSEDRECORD = WM_USER + 1002; type TForm1 = class(TForm) cxGrid1DBTableView1: TcxGridDBTableView; cxGrid1Level1: TcxGridLevel; cxGrid1: TcxGrid; dxMemData1: TdxMemData; dxMemData1Field1: TStringField; dxMemData1Field2: TIntegerField; DataSource1: TDataSource; cxGrid1DBTableView1RecId: TcxGridDBColumn; cxGrid1DBTableView1Field1: TcxGridDBColumn; cxGrid1DBTableView1Field2: TcxGridDBColumn; Timer1: TTimer; CheckBox1: TCheckBox; procedure Timer1Timer(Sender: TObject); procedure dxMemData1AfterPost(DataSet: TDataSet); procedure CheckBox1Click(Sender: TObject); private procedure CMSetFocusedRecord(var Msg: TMessage); message CM_SETFOCUSEDRECORD; public Public declarations end; var Form1: TForm1; FocusedIdx: Integer; implementation $R *.dfm procedure TForm1.Timer1Timer(Sender: TObject); begin dxMemData1.AppendRecord(, IntToStr(Random(1000), Random(1000); end; procedure TForm1.dxMemData1AfterPost(DataSet: TDataSet); begin PostMessage(Handle, CM_SETFOCUSEDRECORD, Integer(cxGrid1DBTableView1), MakeLParam(cxGrid1DBTableView1.Controller.FocusedRowIndex, cxGrid1DBTableView1.Controller.TopRowIndex); end; procedure TForm1.CMSetFocusedRecord(var Msg: TMessage); begin TcxGridDBTableView(msg.WParam).Controller.FocusedRowIndex := Msg.LParamLo; TcxGridDBTableView(msg.WParam).Controller.TopRowIndex := Msg.LParamHi; end; procedure TForm1.CheckBox1Click(Sender: TObject); begin Timer1.Enabled := TCheckBox(Sender).Checked; end; end. = 删除记录并获得焦点 procedure TForm1.BtnDeleteClick(Sender: TObject); var FocusedRow, TopRow: Integer; View: TcxGridTableView; DataController: TcxGridDataController; begin View := cxGrid1.FocusedView as TcxGridTableView; DataController := View.DataController; / Remember the top row (the vertical scrollbar position) TopRow := View.Controller.TopRowIndex; / Remember the focused row(!) index FocusedRow := DataController.FocusedRowIndex; DataController.DeleteFocused; / After deletion the same row must be focused, / although it will correspond to a different data record DataController.FocusedRowIndex := FocusedRow; / Restore the top row View.Controller.TopRowIndex := TopRow; end; 分享一下ExpressQuantumGrid4的cxGrid的一些使用方法和经验日期:2006年2月6日 作者:wangxian11 人气: 9427 查看:大字体 中字体 小字体 使用cxGrid有一些时间了,在这里总结一下使用cxGrid的一些方法,希望给刚开始接触cxGrid的人一些帮助。1.简单介绍:cxGrid右下方的cxGrid1Level1是表示Grid表的层,cxGrid可以有多层,这相当于集合了PageControl的功能,而cxGrid1Level1右边的cxGrid1DBTableView1相当于DBGrid一样。右击cxGrid1可以添加cxGrid1Level2,右击cxGrid1Level2,可以选择Create View , Add level 或者Delete Level。Add level可以增加子Level,Create View里面可以选择很多不同总类的View。其中 1)DB Table可以和数据库连接的View,更一般的DBGrid类似,它比DBGrid多了比如鼠标中键可以用,可以统计,查询,等等功能; 2)DB Banded Table 则可以实现比如: - | 说明1 | 说明2 | - | 字段1 | 字段2 | 字段3 | 字段4 |等类似的功能; 3)DB Card View 则提供了卡片方式的显示数据的功能,这个用在比如人事档案管理比较不错; 4)其它不一一赘述。2.一些使用方法: 1)有图片和MEMO的例子: 拖入一个cxGrid1,Table1,DataSource1。 Table1的DatabaseName设为DBDEMOS,TableName设为biolife.db, Active设为True;DataSource1的DataSet设为Table1;cxGrid1DBTableView1的DataController中的DataSource 设为DataSource1;右击cxGrid1DBTableView1选择Create All Columns;双击cxGrid1,在弹出的窗口中找到 cxGrid1DBTableView1Notes和cxGrid1DBTableView1Graphic,将它们的Properties属性设为BlobEdit;运行看看 结果。再将cxGrid1DBTableView1Graphic的Properties属性设为Image,再将Properties下的Stretch设为True, 将cxGrid1DBTableView1-optionsview-CellAutoHeight 设为True,看看结果。 2)如何让“Drag a column here to group by that column”不显示 解决:点击cxGrid1上的cxGrid1DBTableView1 在cxGrid1DBTableView1-optionsview-groupbybox:=false即可 注:OptionsView里面有很多属性可能经常要用,比如:ColumnAutoWith,Navigator等等,慢慢琢磨吧:) 3)GroupPanel上面的英文Drag a column header to group by that column怎么可以改成中文? 解决:最简单的方法是 TcxGridTableView.OnCustomDrawPartBackground ,也可用 OnCustomDrawGroupCell: procedure TForm1.cxGrid1DBTableView1CustomDrawPartBackground( Sender: TcxGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxCustomGridCellViewInfo; var ADone: Boolean); begin AViewInfo.Text:=动态设置 GroupBox 的显示内容; ACanvas.FillRect(AViewInfo.Bounds); end; 4)如何实现如下功能: +财务部 +原材料仓库 +成品库 +冲压车间 +软件开发部 这个是部门的名称,点击加号就可以将本部门的人员情况显示出来。 解决:其实这是一个主从表关系,1:填好主表的keyfieldnames 2:填好从表的keyfieldnames 3:填好从表的detaikeyfieldNames与masterkeyfieldnames 4: 从表的数据源一定要按与主表关联的字段排序 注:其它地方设置了主从表结构那样就显示不出来,比如设置了从表的Table或者Query的mastersource和 asterfield就会不能显示数据!如果是两个cxGrid的主从关系,这样设置就很OK了。 5)统计功能 解决:cxGrid1DBTableView1-optionsview-Footer 设为True cxGrid1DBTableView1-DataController-Summary设置FooterSummaryItems即可 6)类似PageControl显示 解决:增加一个Level,将cxGrid1-RootLevelOptions-DetailTabsPosition设为dtpTop,然后相应的设置cxGrid1Level1,和cxGrid1Level2的Caption值。 未完待续。 以上是在用cxGrid时候碰到的一些问题,我总结了一部分,还有很多问题等待解决。在这里我希望用过cxGrid的人帮着一起总结一下,让后学者可以少走点弯路! 7)如何设定左边几列,不能滚动? 解决:使用DB Ban

温馨提示

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

评论

0/150

提交评论