妍宝 發表於 2023-9-23 11:49:00

Delphi:cxGrid的使用方法

<p>Delphi:cxGrid的使用方法</p>
<p>1. 去掉cxgrid中抬头的box ,在tableview1的ptionsview的groupbybox=false;<br>2. 在GRID footer 中加入sum(列), tableview1的optionsview的footer=ture<br>然后在cxGRid1的customize中的summary 的footer.add需要合计的列kind= skSum<br>3. 去掉cxgrid 中的过滤下拉箭头选择tableview1.optionscustomize.columnfiltering=fasle;<br>4. cxGrid1DBTableView1 的 OptionView中屬性GroupFooters設為gfAlwaysVisible並設置需要求和的列,在summary.default for Groups 下add加入需要合计的字段,column下显示fieldname 为统计字段,format为格式,kind为统计方法,position 为位子 spfooter 在分组的下面,spgroup 在分组的上面<br>或用cxGridPopupMenu1,在運行時可對任意數字類型列求和,方法是只需設置cxGridPopupMenu1的屬性Grid為cxGrid1DBTableView1的cxGrid,<br>即可實現您所需功能<br>5. DEV Express里的cxGrid默认的数值格式带¥,怎么去掉啊!<br>   雙擊Cxgrid,選擇colmnum改變類型 options.properties.Memo,在displayformat中进行设置<br>6. 在网格最后一行的最后一格回车自动增加一条记录,并跳到新记录的第一格<br>设置cxGrid1DBTableView1的OptionsBehavior的FocusFirsCellOnNewRecord与GoToNextCellOnEnter为True,FocusCellOnCycle设为True<br>7. 网格中通过Tab跳转,设置cxGrid1DBTableView1的OptionsBehavior的FocusCellOnTab为True<br>8. 设置是否能够在网格中编辑数据,设置cxGrid1DBTableView1的OptionsData的Appending设为True,Deleting为True,Editing为True<br>9. 设置是否能选中网格,设置cxGrid1DBTableView1的OptionsSelection的CellSelect为True<br>10. 设置是否能够反选,设置cxGrid1DBTableView1的OptionsSelection的InsertSelect为True<br>11. 设置行高:在cxGridDBTableView1.OptionsView.DataRowHeight<br>12. 改变字体在<br>cxStyleRepository 双击它,在里面添加GridTableViewStyleSheetDevExpress<br>然后改变Style标签里面的cxStyle的字体就可以控制cxGrid的字体了</p>
<p>13. 有图片和MEMO的例子:<br>    拖入一个cxGrid1,Table1,DataSource1。 Table1的DatabaseName设为DBDEMOS,TableName设为biolife.db,<br>Active设为True;DataSource1的DataSet设为Table1;cxGrid1DBTableView1的DataController中的DataSource</p>
<p>   设为DataSource1;右击cxGrid1DBTableView1选择Create All Columns;双击cxGrid1,在弹出的窗口中找到<br>cxGrid1DBTableView1Notes和cxGrid1DBTableView1Graphic,将它们的Properties属性设为BlobEdit;运行看看结果。再将cxGrid1DBTableView1Graphic的Properties属性设为Image,再将Properties下的Stretch设为True,将cxGrid1DBTableView1-&gt;optionsview-&gt;CellAutoHeight 设为True,看看结果。<br>14. 如何让“Drag a column here to group by that column”不显示<br>    解决:点击cxGrid1上的cxGrid1DBTableView1<br>    在cxGrid1DBTableView1-&gt;optionsview-&gt;groupbybox:=false即可<br>15. GroupPanel上面的英文怎么可以改成中文?<br>    解决:最简单的方法是 TcxGridTableView.OnCustomDrawPartBackground ,也可用 OnCustomDrawGroupCell:<br>    procedure TForm1.cxGrid1DBTableView1CustomDrawPartBackground(<br>               Sender: TcxGridTableView; ACanvas: TcxCanvas;<br>            AViewInfo: TcxCustomGridCellViewInfo; var ADone: Boolean);<br>    begin<br>      AViewInfo.Text:='动态设置 GroupBox 的显示内容';<br>      ACanvas.FillRect(AViewInfo.Bounds);<br>    end;<br>16. 如何实现如下功能:<br>         财务部<br>         原材料仓库<br>         成品库<br>         冲压车间<br>         软件开发部<br>    这个是部门的名称,点击加号就可以将本部门的人员情况显示出来。<br>    解决:其实这是一个主从表关系,<br> (1):填好主表的keyfieldnames<br> (2):填好从表的keyfieldnames<br> (3):填好从表的 detaikeyfieldNames与masterkeyfieldnames<br> (4): 从表的数据源一定要按与主表关联的字段排序</p>
<p>      注:其它地方设置了主从表结构那样就显示不出来,比如设置了从表的Table或者Query的mastersource和<br>   asterfield就会不能显示数据!如果是两个cxGrid的主从关系,这样设置就很OK了。<br>17. 类似PageControl显示</p>
<p>   解决:增加一个Level,将cxGrid1-&gt;RootLevelOptions-&gt;DetailTabsPosition设为dtpTop,然后相应的设置cxGrid1Level1,和cxGrid1Level2的Caption值。 <br>18. 如何设定左边几列,不能滚动?<br>   解决:使用DB Banded Table才可以实现,<br>         在cxGrid1DBBandedTableView里建立Band0,Band1<br>         Band0的Fixed=tfLeft<br>         Band1的Fixed=tfnone<br>         设置要锁定的字段的BandIndex=0,其它为1,就OK了。<br>19. 怎样实现如EXCEL一样的,当前格=G14 G15 G16 这样的功能<br>   解决:举一个简单的例子:label1.Caption := cxGrid1DBTableView1.DataController.Values cxGrid1DBTableView2.DataController.Values cxGrid1DBTableView3.DataController.Values;<br>所以不同cxGrid1DBTableView中的数据都可以给当前格,这样就做到了EXCEL中的当前格=G14 G15 G16 类似的功能。</p>
<p>20. 鼠标右击cxGrid1DBBandedTableView1菜单里的Edit Layout什么用,怎么使用?    解决:可以拖动字段,并列的可以拖成有层次感(一层层),拖动时会显示箭头的,就是说可以拖一个字段放</p>
<p>到最上面,就可以使记录按此字段进行分组。点击其中一个字段,上面还会出现一个上升或者下降的小三角形,这个</p>
<p>小三角形的作用是在运行阶段,数据就会按照这个字段上升或者下降排序。<br>    还有一个Set as Default的作用是保持当前TableView的参数,下此产生新的TableView的时候就会可以和上次保持的参数一样。这个还没有做过试验。<br>21. 怎样将cxGrid里的数据导入到EXCEL,HTML,XML和TEXT<br>解决:这个问题在用了cxGrid以后变得异常简单,<br>uses<br> cxExportGrid4Link;</p>
<p>procedure TForm1.Button1Click(Sender: TObject);<br>begin<br> ExportGrid4ToEXCEL('d:\wang.xsl',cxGrid1,True,True);<br> ExportGrid4ToTEXT('d:\wang.txt',cxGrid1,True,True);<br> ExportGrid4ToXML('d:\wang.xml',cxGrid1,True,True);<br> ExportGrid4ToHTML('d:\wang.html',cxGrid1,True,True);<br>end;</p>
<p>22. 如何使满足条件的数据显示不同的颜色?<br>解决:<br>var<br>AYellowStyle: TcxStyle;</p>
<p>procedure TForm1.FormCreate(Sender: TObject);<br>begin<br>//行颜色<br>AYellowStyle := TcxStyle.Create(Self);<br>AYellowStyle.Color := $0080FFFF;<br>AYellowStyle.TextColor := clMaroon;<br>end;</p>
<p>procedure TForm1.cxGrid1DBBandedTableView1StylesGetContentStyle(<br>Sender: TcxCustomGridTableView; ARecord: TcxCustomGridRecord;<br>AItem: TcxCustomGridTableItem; out AStyle: TcxStyle);<br>begin<br>if ARecord.Values &lt;81 then<br>AStyle := AYellowStyle;<br>end;</p>
<p>这里cxGrid1DBBandedTableView1Lengthcm.Index小于81时就显示黄色</p>
<p>23. 如何从外边的TXT文件导入到cxGrid?<br>解决:    procedure CustomizeColumns;<br>          procedure LoadData;</p>
<p>procedure TForm1.CustomizeColumns;<br>const<br> cDistance = 1;<br> cRadius = 5;<br> cPeriod = 4;<br> cPstring = 0;<br>var<br> I: Integer;<br>begin<br> DecimalSeparator := '.';<br> with cxGrid1TableView2 do<br> for I := 0 to ColumnCount - 1 do<br>   if I in then<br>   Columns.DataBinding.ValueTypeClass := TcxIntegerValueType//1,5列为Integer<br>   else<br>   if I in then<br>   Columns.DataBinding.ValueTypeClass := TcxStringValueType//0,4列为String<br>   else<br>      Columns.DataBinding.ValueTypeClass := TcxFloatValueType;//其他为Float<br>end;</p>
<p>procedure TForm1.LoadData;<br>const<br> AFileName = '资产负债表.txt';<br> AHeaderLineCount = 2;</p>
<p>var<br> ARecords, AValues: TStringList;<br> I: Integer;</p>
<p> procedure InitRecord(const Str: string);<br> var<br>   J: Integer;<br>   V: Variant;<br> begin<br>   AValues.CommaText := Str;<br>   for J := 0 to AValues.Count - 1 do<br>    if AValues.Strings &lt;&gt; '-' then<br>    begin<br>   V := AValues.Strings;<br>   if not VarIsNull(V) then<br>       cxGrid1TableView2.DataController.Values := V;<br>    end;<br> end;</p>
<p>begin<br> if not FileExists(AFileName) then<br>   raise Exception.Create('Data file not found');</p>
<p> ARecords := TStringList.Create;<br> AValues := TStringList.Create;</p>
<p> with ARecords do<br> try<br>   LoadFromFile(AFileName);<br>   cxGrid1TableView2.BeginUpdate;<br>   cxGrid1TableView2.DataController.RecordCount := Count - AHeaderLineCount;<br>   for I := 0 to Count - (AHeaderLineCount 1) do<br>   InitRecord(Strings);<br> finally<br>   cxGrid1TableView2.EndUpdate;<br>   ARecords.Free;<br>   AValues.Free;<br> end;<br>end;</p>
<p>procedure TForm1.FormCreate(Sender: TObject);<br>begin<br> CustomizeColumns;<br> LoadData_Zcfz;<br>end;</p>
<p>24. 如何改变列的颜色?<br>var<br> AFirstColumnStyle: TcxStyle;</p>
<p>procedure TForm1.FormCreate(Sender: TObject);<br>begin<br> //列颜色<br> AFirstColumnStyle := TcxStyle.Create(Self);<br> AFirstColumnStyle.Color := clAqua;<br> AFirstColumnStyle.TextColor := clBlue;<br> cxGrid1TableView1.Columns.Styles.Content := AFirstColumnStyle;<br>end;</p>
<p>25.Set as default的用法?<br> 解决:Set as default的用法是为了解决设置参数的方便而做的,比如:<br>       连好数据库以后,更改cxGrid1DBBandedTableView1-&gt;OptionsCustomize-&gt; ColumnFiltering 设为False。(这个设置可以将字段名的下拉单给去掉)更改cxGrid1DBBandedTableView1-&gt;OptionsView- &gt;Navigator 设置为True。然后右击cxGrid1DBBandedTableView1,在弹出的菜单栏里面点击Set as default。<br>OK,下次你再产生一个新的cxGrid1DBBandedTableView1时这些设置和刚才的一样了。如果需要设置的参数很多的时候,这个Set as default很有用!<br> <br>26. 怎样使鼠标移动时,相应的单元里的文字变色?<br>解决:<br>var<br> FTrackItem: TcxCustomGridTableItem;<br> FTrackRec: TcxCustomGridRecord;</p>
<p>procedure TForm1.cxGrid1DBTableView1CustomDrawCell(<br> Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;<br> AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);<br>begin<br> if (AViewInfo.GridRecord = FTrackRec) and (AViewInfo.Item = FTrackItem) then<br> begin<br>   ACanvas.Font.Color := clred;   //红色字体<br>   ACanvas.Font.Style := ;//带下划线<br> end;<br>end;</p>
<p>procedure TForm1.cxGrid1DBTableView1MouseMove(Sender: TObject;<br> Shift: TShiftState; X, Y: Integer);<br>var<br> AHitTest: TcxCustomGridHitTest;<br> ATrackItem: TcxCustomGridTableItem;<br> ATrackRec: TcxCustomGridRecord;<br>begin<br> ATrackItem := FTrackItem;<br> ATrackRec := FTrackRec;</p>
<p> AHitTest := (Sender as TcxGridSite).GridView.ViewInfo.GetHitTest(X, Y);<br> if AHitTest is TcxGridRecordCellHitTest then<br> begin<br>   FTrackItem := TcxGridRecordCellHitTest(AHitTest).Item;<br>   FTrackRec := TcxGridRecordCellHitTest(AHitTest).GridRecord;<br> end<br> else<br> begin<br>   FTrackItem := nil;<br>   FTrackRec := nil;<br> end;</p>
<p> if (ATrackItem &lt;&gt; FTrackItem) or (ATrackRec &lt;&gt; FTrackRec) then<br> begin<br>   // Invalidate old cell<br>   if ATrackRec &lt;&gt; nil then<br>   ATrackRec.Invalidate(ATrackItem);<br>   // Invalidate new cell<br>   if FTrackRec &lt;&gt; nil then<br>   FTrackRec.Invalidate(FTrackItem);<br> end;<br>end;</p>
<p>27. 怎样设计多表头的cxGrid?<br>解决:cxGrid可以解决如下的表头:<br>                   ---------------------------------<br>                   |   说明1   |   说明2   |<br>                   ---------------------------------<br>                   | 字段1 | 字段2 | 字段3 | 字段4 |<br>                   |      字段5    |   字段6   |<br>                   |      字段7    | 字段8 | 字段9 |<br>实现这个很简单,你可以直接在上面拖动字段名,拖动时会显示箭头的,放入你想显示的位置就OK了。或者在鼠标右击cxGrid1DBBandedTableView1菜单里的Edit Layout里也可以拖放。</p>
<p>28. 在主从表结构时,当点开“ ”时怎样将焦点聚在相应主表的记录上?<br>解决:<br>var<br> HitTest: TcxCustomGridHitTest;</p>
<p>procedure TColumnsShareDemoMainForm.tvProjectsMouseDown(Sender: TObject;<br> Button: TMouseButton; Shift: TShiftState; X, Y: Integer);<br>begin<br> // Note that the Sender parameter is a Site<br> HitTest := (Sender as TcxGridSite).GridView.ViewInfo.GetHitTest(X, Y);<br> // The point belongs to the [ ]/[-] button area<br> if HitTest is TcxGridExpandButtonHitTest then<br>   // Move focus to the record<br>   TcxGridExpandButtonHitTest(HitTest).GridRecord.Focused := True;<br>end;</p>
<p>29. CXGrid4如何展开全部节点<br> 解决:GridDBTableView1.DataController.Groups.FullExpand;<br> </p>
<p>30. cxGrid如何动态创建Items的Editor的项?<br>   cxGrid的列有一个属性,它的编辑框可以指定combobox,spinedit等.在设计时,可以为<br>   combobox的items添加项目.请问是否可以动态创建?(run-time时由程序加入)</p>
<p>解决:<br> var<br>   A:TDataSource:<br>   B:TcxlookupcomboboxProperties;<br>    begin<br>   A:=TDataSource.create(self);<br>   B:=tcxlookupcomboboxproperties.create(self);<br>   A.Dataset:=Dic_ry_xb;//此处指定数据源。<br>   b.listdource:=a;//此处指明字段的listsource属性。<br>   b.keyfieldnames:='a';    //此处指明字段的关键字段<br>   b.listfieldnames:='b';   //此处指明字段的返回值。<br>   b.listcolumns.items.caption:='x;       //此处默认是会建立一个字段,但是显示的表头是name,所以此处让它显示为自己想要的中午显示。<br>   cxGrid1DBTableView1c1_sex_code.Properties:=b;//此处指明是那个字段。<br>   end;//这个是初始化的代码,</p>
<p>31. 获得当前行<br>   cgBrowseView.DataController.GetSelectionAnchorRowIndex</p>
<p>32. 分组<br>设置DBTableView的OptionCustomize-&gt;ColumnGrouping为True<br>并设置要分组的字段的GroupIndex为一大于等于0的值</p>
<p>33. TdxDBTreeView的节点移动排序<br>利用TdxDBTreeView控件(此处设为DBTreeMain)时,可以从表中直接显示出树结构,有时需要拖动对节点进行排序,而且数据表中有字段SortCode用于排序码,此时需要编写对应代码,步骤如下<br>(1).先设置DBTreeMain的DragMode属性为dmAutomatic<br>(2).设置DBTreeMain的StateIndexField属性为SortCode<br>(3).在其OnEndDragTreeNode事件中写入<br>var<br>m: TNodeAttachMode;<br>oldOption: TdxDBTreeViewOptions;<br>node: TdxDBTreeNode;<br>bm: TBookmarkStr;<br>idx: Integer;<br>begin<br>inherited;<br>try<br>    frmDragOption := TfrmDragOption.Create(nil);<br>    if frmDragOption.ShowModal = mrOK then<br>    begin<br>      //ShowMessage('1');<br>      if frmDragOption.rgOption.ItemIndex = 0 then<br>      m := naInsert<br>      else<br>      m := naAddChild;<br>      AttachMode := m;<br>      with DBTreeMain do<br>      begin<br>      oldOption := Options;<br>      Options := Options - ;<br>      OnCompare := nil;<br>      bm := qryTree.Bookmark;<br>      qryTree.DisableControls;<br>      Items.BeginUpdate;<br>      try<br>          if m = naInsert then<br>          begin<br>            node := TdxDBTreeNode(Destination);<br>            idx := node.ImageIndex;<br>            UpdateSortCode(Source, idx);<br>            while node &lt;&gt; nil do<br>            begin<br>            Inc(idx, 10);<br>            UpdateSortCode(node, idx);<br>            node := TdxDBTreeNode(node.getNextSibling);<br>            if node = Source then<br>                Break;<br>            end;<br>          end<br>          else //添加子<br>          begin<br>            idx := GetChildMaxIdx(Destination) 10;<br>            UpdateSortCode(Source, idx);<br>          end;<br>      finally<br>          Items.EndUpdate;<br>          Options := oldOption;<br>          OnCompare := DBTreeMainCompare;<br>          qryTree.EnableControls;<br>          qryTree.Bookmark := bm;<br>      end;<br>      end;<br>    end<br>    else<br>      //<br>finally<br>    frmDragOption.Free;<br>end;<br>end;</p>
<p>//UpdateSortCode过程<br>procedure TfrmSetTree.UpdateSortCode(ANode: TTreeNode; ASortCode: Integer);<br>var<br>key: Variant;<br>begin<br>key := TdxDBTreeNode(ANode).KeyFieldValue;<br>with qryTree do<br>begin<br>    if Locate('ID', key, []) then<br>    begin<br>      Edit;<br>      FieldByName('SortCode').AsInteger := ASortCode;<br>      Post;<br>    end;<br>end;<br>ANode.ImageIndex := ASortCode;<br>end;</p>
<p>//GetChildMaxIdx过程<br>function TfrmSetTree.GetChildMaxIdx(ANode: TTreeNode): Integer;<br>var<br>i: Integer;<br>begin<br>Result := 0;<br>for i := 0 to ANode.Count - 1 do<br>begin<br>    if ANode.ImageIndex &gt; Result then<br>      Result := ANode.ImageIndex;<br>end;<br>end;</p>
<p>(4).在其OnCompare事件中写入<br>procedure TfrmSetTree.DBTreeMainCompare(Sender: TObject; Node1,<br>Node2: TTreeNode; Data: Integer; var Compare: Integer);<br>begin<br>inherited;<br>if Node1.ImageIndex &gt; Node2.ImageIndex then<br>    Compare := 1<br>else if Node1.ImageIndex = Node2.ImageIndex then<br>    Compare := 0<br>else<br>    Compare := -1;<br>end;</p>
<p><br>34.在TdxDBTreeView控件的OnEditing事件中写入<br>AllowEdit := CheckEdit;//CheckEdit为判断的函数</p>
<p>35.选择某一行<br>cxgrdimport.SetFocus;<br>DBTVimport.ViewData.Records.Selected;</p>
<p>36.cxgrid单击某一网格事件,可在ViewTable的KeyPress事件中判断<br>if Key = #32 then<br>begin<br>if Trim(colname.EditValue) = '' then<br>    colcode.FocusWithSelection<br>//else<br>//colReqNum.Editing := True;<br>end;</p>
<p>37.动态生成列<br>procedure CreateDynamicCols;<br>var<br>    i, B_index: Integer;<br>begin<br>    with BTVgather.Bands.Add do<br>    begin<br>      Caption := lcb1.Text;<br>      Position.ColIndex := 2;<br>    end;</p>
<p>    for i := 4 to dsgather.DataSet.FieldCount - 1 do<br>    begin<br>      with BTVgather.Bands.Add do<br>      begin<br>      Position.BandIndex := 2;<br>      B_index := Index;<br>      Caption := dsgather.DataSet.Fields.FieldName;<br>      with BTVgather.CreateColumn do<br>      begin<br>          Position.BandIndex := B_index;<br>          Caption := dsgather.DataSet.Fields.FieldName;<br>          DataBinding.FieldName := dsgather.DataSet.Fields.FieldName;<br>          PropertiesClassName := 'TcxCurrencyEditProperties';<br>          TcxCurrencyEditProperties(Properties).DisplayFormat := ',0.00;-,0.00';<br>          Width := 80;<br>          OnGetDisplayText := Self.OnGetDisplayText;<br>      end;<br>      end;<br>    end;<br>    if BTVgather.Bands.ChildBandCount = 1 then<br>      BTVgather.Bands.Width := 90<br>    else<br>      BTVgather.Bands.Width := BTVgather.Bands.ChildBandCount * 90;<br>end;</p>
<p>38.如何判断cxgrid单击了哪一列<br>procedure TFormModel.cxGrid1DBTableView1CellClick(<br>Sender: TcxCustomGridTableView;<br>ACellViewInfo: TcxGridTableDataCellViewInfo; AButton: TMouseButton;<br>AShift: TShiftState; var AHandled: Boolean);<br>begin<br>ShowMessage(ACellViewInfo.Item.Caption);<br> <br>//s :=ACellViewInfo.GridRecord.Values;<br>//showmessage(s);<br>end;</p>
<p>39.改变CheckBox后直接提交(在PropertiesEditValueChanged中实现)</p>
<p>首先要设置此字段的options-&gt;Editing为True,然后写入代码(假设此字段为ViewDataColumn11):<br>procedure TfrmMain.ViewDataColumn11PropertiesEditValueChanged(<br>Sender: TObject);<br>var<br>RecMark:string;<br>begin<br>inherited;<br>ViewData.NavigatorButtons.Post.Click;<br>if (FBiz.QryData1.FieldByName('PrintFlag').AsInteger=0) and<br>    (FBiz.QryData1.FieldByName('BillNo').AsInteger=0) then<br>begin<br>    RecMark :=FBiz.QryData1.Bookmark;<br>    FBiz.QryData1.DisableControls;<br>    ExecQuery(qryRemote1,'update main set PrintFlag=0 where type=' FBiz.QryData1.FieldByName('Type').AsString);<br>    ShowQuery(FBiz.QryData1,'select * from Main order by Type,Code,BillNo');<br>    FBiz.QryData1.EnableControls;<br>    FBiz.QryData1.Bookmark :=RecMark;<br>end;<br>end;</p>
<p>40.根据数据改变行的颜色</p>
<p>procedure TfrmMain.ViewDataStylesGetContentStyle(<br>Sender: TcxCustomGridTableView; ARecord: TcxCustomGridRecord;<br>AItem: TcxCustomGridTableItem; out AStyle: TcxStyle);<br>begin<br>inherited;<br>if (ARecord.Values=0) and<br>    (ARecord.Values=999999) then<br>    AStyle :=cxStyle4;<br>end;</p>
<p>41.动态生成汇总列</p>
<p>procedure TfrmMain.CreateDynamicCols;<br>var<br>csgItem: TcxDataSummaryItem;<br>i: Integer;<br>begin<br>{$IFDEF Test}codesite.SendMsg('1'); {$ENDIF}<br>btv2.DataController.Summary.FooterSummaryItems.Clear;<br>for i := 0 to dsview2.DataSet.FieldCount - 1 do<br>begin<br>    btv2.DataController.Summary.BeginUpdate;</p>
<p>    with btv2.CreateColumn do<br>    begin<br>      Caption := dsview2.DataSet.Fields.FieldName;<br>{$IFDEF Test}codesite.SendMsg(Caption); {$ENDIF}<br>      DataBinding.FieldName := dsview2.DataSet.Fields.FieldName;<br>      HeaderAlignmentHorz := taCenter;</p>
<p>      if i &gt; 0 then<br>      begin<br>      PropertiesClassName := 'TcxCurrencyEditProperties';<br>      if (i mod 2) = 0 then<br>      begin<br>          TcxCurrencyEditProperties(Properties).DisplayFormat := ',0.00;-,0.00';<br>          csgItem := btv2.DataController.Summary.FooterSummaryItems.Add;<br>          csgItem.ItemLink := BTV2.Columns;<br>          csgItem.Kind := skSum;<br>          csgItem.Position := spFooter;<br>      end<br>      else<br>          TcxCurrencyEditProperties(Properties).DisplayFormat := ',0;-,0';<br>      end;<br>{$IFDEF Test}codesite.SendMsg('2'); {$ENDIF}<br>      if i &gt; 1 then<br>      Position.BandIndex := 1;<br>      if i = 0 then<br>      Width := 78<br>      else<br>      if i = 1 then<br>          Width := 96<br>      else<br>          Width := 84;<br>    end;<br>{$IFDEF Test}codesite.SendMsg('3'); {$ENDIF}<br>    BTV2.Bands.Width := 78 96;<br>    BTV2.Bands.Width := BTV2.Bands.ChildBandCount * 84;<br>    btv2.DataController.Summary.EndUpdate;<br>end;<br>end;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>》》》》》》》》》》》》》》</p>
<p>&nbsp;</p>
<p>转自 http://bzdjc.blogbus.com/logs/32340883.html</p>
<p>1.简单介绍:cxGrid右下方的cxGrid1Level1是表示Grid表的层,cxGrid可以有多层,这相当于集合了PageControl的</p>
<p>功能, 而cxGrid1Level1右边的cxGrid1DBTableView1相当于DBGrid一样。右击cxGrid1可以添加cxGrid1Level2,右击</p>
<p>cxGrid1Level2,可以选择Create View , Add level 或者Delete Level。Add level可以增加子Level,Create View</p>
<p>里面可以选择很多不同总类的View。其中<br>1)DB Table可以和数据库连接的View,更一般的DBGrid类似,它比DBGrid多了比如鼠标中键可以用,可以统计,</p>
<p>查询,等等功能;<br>2)DB Banded Table 则可以实现比如:<br>---------------------------------<br>| 说明1 | 说明2 |<br>---------------------------------<br>| 字段1 | 字段2 | 字段3 | 字段4 |<br>等类似的功能;<br>3)DB Card View 则提供了卡片方式的显示数据的功能,这个用在比如人事档案管理比较不错;</p>
<p>&nbsp;</p>
<p>cxgrid (数据库控件)控件的使用</p>
<p>http://bzdjc.blogbus.com/logs/32340635.html</p>
<p>2:一般用来查阅表信息,如果要修改的话,直接在上面编辑或添加非常不方便    <br>通常要放几个EDit来对选中的记录进行编辑或添加记录。    <br>因为表一般都有主键,而用cxgrid很难控制。在post之前的主键检查工作。   <br>3:由于没有直接进行编辑,而post之前又要进行主键检查工作(需要循环    <br>adoquery,此时的记录索引已经改变了)。所以我们要用一个bookmack。在编辑    <br>的时候先Getbookmack,在确认修改数据的时候,先GotoBookMark,再把值更新。   <br>4:在选择某条记录后,需要得到相应的字段值显示在Edit上面,这个时候就要用    <br>cxGridDBTableView的Cellclick事件里面处理;    <br>可以用click事件里面的一个参数:ACellViewInfo。该参数的一个属性;    <br>如:EdtMperson.text := ACellViewInfo.GridRecord.Values;   <br>5:当需要得到随机选择的多条记录时有两种办法   <br>qrymast是一个adoquery   <br>⑴第一步得到选择的总数   <br>Icount := cxGrid1DBTableView1.DataController.GetSelectedCount;   <br>⑵循环所有所选择的记录   <br>for n := 0 to icount-1 do    begin   <br>⑶将选择记录的索引转换为数据集的索引   <br>i := cxGrid1DBTableView1.DataController.GetSelectedRowIndex(n);      <br>如果cxgriddbtableview没有设置排序,那么第一种方法也是正确的(因为cxgriddbtableview显示   <br>的数据和qrymast显示的数据顺序是一样的)          <br>//这是第一种方法,取qrymast的数据   <br>inc(i);<br>//因为qrymast的记录是从1开始的   <br>qryMast.RecNo := i;   <br>得到需要的数据值   <br>listbox1.Items.Add(qrymast.fields.asstring);      <br>//这是第二种方法,取cxGrid1DBTableView1.ViewData的数据    <br>if i =0 then       <br> cxGrid1DB.DataController.GotoFirst   <br>else       <br> cxGrid1DBTableView1.DataController.RecNo := i;   <br> str := cxGrid1DBTableView1.ViewData.Rows.Values;   <br> listbox1.Items.Add(str);    <br>end;          <br>(一次测试的时候,cxGrid1DBTableView1.DataController.RecNo := 0;语句会报错,如果改为cxGrid1DB.DataController.GotoFirst,就没有问题)   <br>6: 当有时候用到ACellViewInfo.GridRecord.Values时候,由于values是一个变体    <br>类型Variant,而如果这个时候相应的字段值如果为空,下面这样用就会报错。    <br>EdtMperson.text := ACellViewInfo.GridRecord.Values;   可以先判断一下:   <br>if ACellViewInfo.GridRecord.Values&lt;&gt;null then       <br> MemRdesc.Lines.Text := ACellViewInfo.GridRecord.Values;</p><br><br>
来源:https://www.cnblogs.com/lucken2000/p/17724120.html
頁: [1]
查看完整版本: Delphi:cxGrid的使用方法