zoukankan      html  css  js  c++  java
  • CxGrid用法

    CxGrid用法
                                          
    使用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值。
     
    7)如何设定左边几列,不能滚动?
       解决:使用DB Banded Table才可以实现,
             在cxGrid1DBBandedTableView里建立Band0,Band1
             Band0的Fixed=tfLeft
             Band1的Fixed=tfnone
             设置要锁定的字段的BandIndex=0,其它为1,就OK了。  
     
     8)怎样实现如EXCEL一样的,当前格=G14+G15+G16 这样的功能
       解决:举一个简单的例子:label1.Caption := cxGrid1DBTableView1.DataController.Values[2,
     
    3]+cxGrid1DBTableView2.DataController.Values[1, 1]+cxGrid1DBTableView3.DataController.Values[1, 1];
    所以不同cxGrid1DBTableView中的数据都可以给当前格,这样就做到了EXCEL中的当前格=G14+G15+G16 类似的功能。
     
     9)鼠标右击cxGrid1DBBandedTableView1菜单里的Edit Layout什么用,怎么使用?
       解决:可以拖动字段,并列的可以拖成有层次感(一层层), 拖动时会显示箭头的,就是说可以拖一个字段放
     
    到最上面,就可以使记录按此字段进行分组。点击其中一个字段,上面还会出现一个上升或者下降的小三角形,这个
     
    小三角形的作用是在运行阶段,数据就会按照这个字段上升或者下降排序。
        还有一个Set as Default的作用是保持当前TableView的参数,下此产生新的TableView的时候就会可以和上次保持的参数一样。这个还没有做过试验。
     
     
    10)怎样将cxGrid里的数据导出到EXCELHTMLXMLTXT
     解决:这个问题在用了cxGrid以后变得异常简单,
    A.导出到固定路径和名称
    uses
     cxGridExportLink;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
     ExportGridToExcel('d:\wang.xsl',cxGrid1,True,True);
     ExportGridToTEXT('d:\wang.txt',cxGrid1,True,True);
     ExportGridToXML('d:\wang.xml',cxGrid1,True,True);
     ExportGridToHTML('d:\wang.html',cxGrid1,True,True);
    end;
    B.导出到任意路径和名称自定义
    uses  
    cxGridExportLink,
     
    procedure TForm1.Button1Click(Sender: TObject);
    var sName:string;
    begin
    if SaveDialog1.Execute then sName:= SaveDialog1.FileName;
     if sName<>'' then ExportGridToExcel(sName,cxGrid1,True);
    end;
     
    11)如何使满足条件的数据显示不同的颜色?
    解决:
    var
    AYellowStyle: TcxStyle;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
     //行颜色
    AYellowStyle := TcxStyle.Create(Self);
    AYellowStyle.Color := $0080FFFF;
    AYellowStyle.TextColor := clMaroon;
    end;
     
    procedure TForm1.cxGrid1DBBandedTableView1StylesGetContentStyle(
    Sender: TcxCustomGridTableView; ARecord: TcxCustomGridRecord;
    AItem: TcxCustomGridTableItem; out AStyle: TcxStyle);
    begin
    if ARecord.Values[cxGrid1DBBandedTableView1Lengthcm.Index] < 81 then
     AStyle := AYellowStyle;
    end;
     
    这里cxGrid1DBBandedTableView1Lengthcm.Index小于81时就显示黄色
     
     
    12)如何从外边的TXT文件导入到cxGrid
    解决:    procedure CustomizeColumns;
              procedure LoadData;
     
    procedure TForm1.CustomizeColumns;
    const
     cDistance = 1;
     cRadius = 5;
     cPeriod = 4;
     cPstring = 0;
    var
     I: Integer;
    begin
     DecimalSeparator := '.';
     with cxGrid1TableView2 do
     for I := 0 to ColumnCount - 1 do
       if I in [cDistance, cRadius] then
         Columns[I].DataBinding.ValueTypeClass := TcxIntegerValueType//1,5列为Integer
       else
         if I in [cPstring,cPeriod] then
         Columns[I].DataBinding.ValueTypeClass := TcxStringValueType//0,4列为String
         else
          Columns[I].DataBinding.ValueTypeClass := TcxFloatValueType;//其他为Float
    end;
     
    procedure TForm1.LoadData;
    const
     AFileName = '资产负债表.txt';
     AHeaderLineCount = 2;
     
    var
     ARecords, AValues: TStringList;
     I: Integer;
     
     procedure InitRecord(const Str: string);
     var
       J: Integer;
       V: Variant;
     begin
       AValues.CommaText := Str;
       for J := 0 to AValues.Count - 1 do
        if AValues.Strings[J] <> '-' then
        begin
         V := AValues.Strings[J];
         if not VarIsNull(V) then
           cxGrid1TableView2.DataController.Values[I, J] := V;
        end;
     end;
     
    begin
     if not FileExists(AFileName) then
       raise Exception.Create('Data file not found');
     
     ARecords := TStringList.Create;
     AValues := TStringList.Create;
     
     with ARecords do
     try
       LoadFromFile(AFileName);
       cxGrid1TableView2.BeginUpdate;
       cxGrid1TableView2.DataController.RecordCount := Count - AHeaderLineCount;
       for I := 0 to Count - (AHeaderLineCount + 1) do
         InitRecord(Strings[I + AHeaderLineCount]);
     finally
       cxGrid1TableView2.EndUpdate;
       ARecords.Free;
       AValues.Free;
     end;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
     CustomizeColumns;
     LoadData_Zcfz;
    end;
    其中“资产负债表.txt”中的数据如下:

    资            产      行次      年      初      数      期      末      数      负债及所有者权益      行次      年      初      数      期      末      数
    ---------           ----        -----              --------            ----------              ----         --------            ---------
    流动资产:      1      0.00              0.00              流动负债:              2      0.00              0.00  
     
    13)如何改变列的颜色?
    var
     AFirstColumnStyle: TcxStyle;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
     //列颜色
     AFirstColumnStyle := TcxStyle.Create(Self);
     AFirstColumnStyle.Color := clAqua;
     AFirstColumnStyle.TextColor := clBlue;
     cxGrid1TableView1.Columns[1].Styles.Content := AFirstColumnStyle;
    end;
     
     
    14Set as default的用法?
     解决:Set as default的用法是为了解决设置参数的方便而做的,比如:
           连好数据库以后,更改cxGrid1DBBandedTableView1->OptionsCustomize->ColumnFiltering 设为False。(这个设置可以将字段名的下拉单给去掉)更改cxGrid1DBBandedTableView1->OptionsView->Navigator 设置为True。然后右击cxGrid1DBBandedTableView1,在弹出的菜单栏里面点击Set as default。
     OK,下次你再产生一个新的cxGrid1DBBandedTableView1时这些设置和刚才的一样了。如果需要设置的参数很多的时候,这个Set as default很有用!
     
     
    15)怎样使鼠标移动时,相应的单元里的文字变色?
     解决:
    var
     FTrackItem: TcxCustomGridTableItem;
     FTrackRec: TcxCustomGridRecord;
     
    procedure TForm1.cxGrid1DBTableView1CustomDrawCell(
     Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
     AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
    begin
     if (AViewInfo.GridRecord = FTrackRec) and (AViewInfo.Item = FTrackItem) then
     begin
       ACanvas.Font.Color := clred;   //红色字体
       ACanvas.Font.Style := [fsUnderline];//带下划线
     end;
    end;
     
    procedure TForm1.cxGrid1DBTableView1MouseMove(Sender: TObject;
     Shift: TShiftState; X, Y: Integer);
    var
     AHitTest: TcxCustomGridHitTest;
     ATrackItem: TcxCustomGridTableItem;
     ATrackRec: TcxCustomGridRecord;
    begin
     ATrackItem := FTrackItem;
     ATrackRec := FTrackRec;
     
     AHitTest := (Sender as TcxGridSite).GridView.ViewInfo.GetHitTest(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
         ATrackRec.Invalidate(ATrackItem);
       // Invalidate new cell
       if FTrackRec <> nil then
         FTrackRec.Invalidate(FTrackItem);
     end;
    end;
     
     
    16)ExpressQuantumGrid 3.2.2中的dxdbgrid4.2版本中的cxgrid有什么区别?
    有很大的区别,基本上相当于是两个控件一样。
    cxgrid是在dxdbgrid基础上完全重写的,所以cxgrid不支持dxdbgrid
    所以cxgrid里面特意提供了一个将dxdbgrid导入到cxgrid的功能。
     
     
    17)怎样设计多表头的cxGrid
     解决:cxGrid可以解决如下的表头:
                       ---------------------------------
                       |     说明1     |     说明2     |
                       ---------------------------------
                       | 字段1 | 字段2 | 字段3 | 字段4 |
                       |      字段5    |     字段6     |
                       |      字段7    | 字段8 | 字段9 |
    实现这个很简单,你可以直接在上面拖动字段名,拖动时会显示箭头的,放入你想显示的位置就OK了。或者在鼠标右击cxGrid1DBBandedTableView1菜单里的Edit Layout里也可以拖放。
     
    但是cxGrid不能实现如下的多表头形式:
                       ---------------------------------
                       |     说明1     |     说明2     |
                       ---------------------------------
                       | 说明3 | 说明4 | 说明5 | 说明6 |
                       |      字段1    |     字段2     |
                       |      字段3    | 字段4 | 字段5 |
    不知道有谁能实现这样的多表头?
     
    18)在主从表结构时,当点开“+”时怎样将焦点聚在相应主表的记录上?
    解决:
    var
     HitTest: TcxCustomGridHitTest;
     
    procedure TColumnsShareDemoMainForm.tvProjectsMouseDown(Sender: TObject;
     Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    begin
     // Note that the Sender parameter is a Site
     HitTest := (Sender as TcxGridSite).GridView.ViewInfo.GetHitTest(X, Y);
     // The point belongs to the [+]/[-] button area
     if HitTest is TcxGridExpandButtonHitTest then
       // Move focus to the record
       TcxGridExpandButtonHitTest(HitTest).GridRecord.Focused := True;
    end;
     
     
    19)CXGrid4如何展开全部节点
     解决:GridDBTableView1.DataController.Groups.FullExpand;
     
    20cxGrid如何动态创建ItemsEditor的项?
       cxGrid的列有一个属性,它的编辑框可以指定combobox,spinedit等.在设计时,可以为
       combobox的items添加项目.请问是否可以动态创建?(run-time时由程序加入)
     
    解决:
    var
     A:TDataSource:
     B:TcxlookupcomboboxProperties;
          begin
     A:=TDataSource.create(self);
     B:=tcxlookupcomboboxproperties.create(self);
     A.Dataset:=Dic_ry_xb;//此处指定数据源。
     b.listdource:=a;//此处指明字段的listsource属性。
     b.keyfieldnames:='a';    //此处指明字段的关键字段
     b.listfieldnames:='b';   //此处指明字段的返回值。
     b.listcolumns.items[0].caption:='x; //此处默认是会建立一个字段,但是显示的表头是name,所以此处让它显示为自己想要的中午显示。
            cxGrid1DBTableView1c1_sex_code.Properties:=b; //此处指明是那个字段。
    end; //这个是初始化的代码
     
    21)怎样取得CxGridSummary统计数据?
    for j := 1 to Summary.FooterSummaryItems.Count do
    begin
        ShowMessage(VarToStr(cxGrid_Main_View.DataController.Summary.FooterSummaryValues[j]));
    end
    //cxGrid_Main_View为cxGrid的View
     
    22)如何用代码展开/收缩主从结构   
    Self.tvDepartment.ViewData.Expand(True);   
    Self.tvDepartment.ViewData.Collaspe(True);  
    注:tvDepartment为主表对应的TableView
     
    23cxgrid复制粘贴操作
    1、uses clipbrd;
    2、复制
    procedure TForm1.cxButton1Click(Sender: TObject);
    var
    p1,p2:integer;
    p3:string;
    begin
    p1:=cxGrid5DBTableView1.Controller.FocusedRowIndex;
    p2:=cxGrid5DBTableView1.Controller.FocusedColumnIndex;
    p3:=cxGrid5DBTableView1.DataController.Values[p1,p2];
    showmessage(inttostr(p1)+','+inttostr(p2)+','+p3);
    clipboard.AsText:=p3;
    3.粘贴
    procedure TForm1.cxButton1Click(Sender: TObject);
    begin
    keybd_event(VK_Control, MapVirtualKey(VK_Control, 0), 0, 0);
    keybd_event(ord('C'), MapVirtualKey(ord('C'), 0), 0, 0);
    keybd_event(ord('C'), MapVirtualKey(ord('C'), 0), KEYEVENTF_KEYUP, 0);
    keybd_event(VK_Control, MapVirtualKey(VK_Control, 0), KEYEVENTF_KEYUP,0); 
    end;
  • 相关阅读:
    vue使用elementui合并table
    使用layui框架导出table表为excel
    vue使用elementui框架,导出table表格为excel格式
    前台传数据给后台的几种方式
    uni.app图片同比例缩放
    我的博客
    【C语言】取16进制的每一位
    SharePoint Solution 是如何部署的呢 ???
    无效的数据被用来用作更新列表项 Invalid data has been used to update the list item. The field you are trying to update may be read only.
    SharePoint 判断用户在文件夹上是否有权限的方法
  • 原文地址:https://www.cnblogs.com/karkash/p/3072676.html
Copyright © 2011-2022 走看看