回炉再煅——Delphi6,CxGrid4功能实现小记(分组、下拉框、多行复制)

由于公司业务的关系,又要写回Delphi程序。以下是为完成客户需求时所写的一些功能需求代码,作为又一次的记录。

IDE版本:Delphi6, 控件版本:DevExpress4.5

先来个D6截图,缅怀一下


CxGrid的强大不容置疑,但也带来的繁多的属性与复杂的操作,加上能找到的中文说明不多,所以很多时候只能通过看例子和自己摸索。


一、代码实现分组

CxGrid可以实现客户端本地分组查询,但很多时候需要用户自己动鼠标拖动实现。如要程序自动实现,很多时候需要靠代码完成。以下为代码:

procedure SetCxGridGroup(cxTableView:TcxGridDBTableView; groupField : string; fields : array of string; SumKinds:array of TcxSummaryKind);

参数介绍:

         cxTableView: TcxGridDBTableView对象;

         groupField:分组字段名

         fields:要实现统计的字段名数组

         SumKinds:要统计字段的统计类型

 

procedure TForm.SetCxGridGroup(cxTableView:TcxGridDBTableView; groupField : string; fields : array of string; SumKinds:array of TcxSummaryKind);

var

  i,j : Integer;

  csg: TcxDataSummaryGroup;

 col: TcxGridDBColumn;

 item : TcxGridDBTableSummaryItem;

begin

  ifcxTableView.DataController.DataSource.DataSet.Active then

 begin

   cxTableView.OptionsView.GroupByBox := False; //关闭分组栏

   cxTableView.OptionsView.Footer := true;      //显示页脚栏

   cxTableView.OptionsView.GroupFooters:= gfVisibleWhenExpanded; //显示分组页脚栏

 

   csg := cxTableView.DataController.Summary.SummaryGroups.Add; //增加分组对象

   //循环CxGrid列

   for i := 0 to cxTableView.ColumnCount - 1 do

   begin

     if cxTableView.Columns[i].DataBinding.FieldName = groupField then //通过对比字段名,增加分组

     begin

       //创建分组

       col := cxTableView.Columns[i];

       col.Caption:= cxTableView.Columns[i].Caption;

       col.GroupIndex := 0;

     end else

     begin

       for j := Low(fields) to High(fields) do

       begin

         if cxTableView.Columns[i].DataBinding.FieldName = fields[j] then //增加分组统计

         begin

           item := TcxGridDBTableSummaryItem(cxTableView.DataController.Summary.DefaultGroupSummaryItems.Add);

           item.Column := cxTableView.Columns[i];

           item.Kind := SumKinds[j];

           item.Position := spFooter;                

           Break;

         end;//if

       end;//for

     end;//else

   end;//for

   cxTableView.DataController.Groups.FullExpand;

 end;//if

end;
效果图


二、指定字段实现下拉框

Uses cxDropDownEdit;
...
  cxTableView.GetColumnByFieldName('type').PropertiesClass := TcxComboBoxProperties;
  TcxComboBoxProperties(cxTableView.GetColumnByFieldName('type').Properties).DropDownListStyle := lsFixedList;
  TcxComboBoxProperties(cxTableView.GetColumnByFieldName('type').Properties).Items.Add('A-Type');

三、行复制

var
  i, j : Integer;
  temp : string;    	//临时累加数据值
  list : TStrings;  	//累加数据值
  edt : TCustomEdit;	//临时Edit,用于将数据拷贝到内存中,利用Edit偷个懒
  aDS : TDataSet;  	//CxGrid的DataSet
 begin
    list := TStringList.Create;

    edt := TCustomEdit.Create(Self);//生成临时Edit
    edt.Visible := False;
    edt.Parent := Self;
try
    aDS := cxTableView.DataController.DataSource.DataSet;
    for i := 0 to cxTableView.Controller.SelectedRowCount - 1 do
    begin
      if cxTableView.Controller.SelectedRecords[i].HasCells then //判断是否有单元格,防止拷贝到分组项
      begin
        temp := '';
        aDS.Locate(keyField, cxTableView.Controller.SelectedRows[i].Values[cxTableView.GetColumnByFieldName(keyField).Index],[]);
        for j := 0 to aDS.FieldCount - 1 do
          temp := temp + aDS.FieldByName(aDS.Fields.Fields[j].FieldName).AsString + #9;
        list.Add(temp);
      end;
    end;
    edt.Text := list.Text;
    edt.SelectAll;
    edt.CopyToClipboard;
  finally
    if Assigned(edt) then
      FreeAndNil(edt);
    if Assigned(list) then
      FreeAndNil(list);
  end;

如果CxGrid不进行分组,也可以这样写

var

  i,j : Integer;

 temp : string;

 list : TStrings;

  edt: TCustomEdit;

  r :TcxRowInfo;

begin

   list := TStringList.Create;

 

   edt := TCustomEdit.Create(Self);

   edt.Visible := False;

   edt.Parent := Self;

try

   for i := 0 to cxTableView.Controller.SelectedRowCount - 1 do

   begin

           r.RecordIndex :=aCXTV.Controller.SelectedRecords[i].Index;

           temp := '';

     for j := 0 to aCXTV.ItemCount - 1 do

       temp := temp +aCXTV.DataController.GetRowDisplayText(r, j) + #9;

           list.Add(temp);

    end;

   edt.Text := list.Text;

   edt.SelectAll;

   edt.CopyToClipboard;

 finally

   if Assigned(edt) then

     FreeAndNil(edt);

   if Assigned(list) then

     FreeAndNil(list);

 end;


四、拷贝禁止修改的单元格值

 该处有误,为不误导广大市民就删了

五、获取鼠标所选单元格值

开始用了

cxTableView.Controller.FocusedRow.Values[cxTableView.Controller.FocusedColumnIndex];

后来发现以上写法,在有隐藏列的情况下会有列错位的问题,一般会隐藏几列,就会错几位。

经查看

   row := cxTV.Controller.FocusedRowIndex;

   col := cxTV.Controller. FocusedColumnIndex;

这两个得到的是显示的位置下标输出的值,而无论
cxTV.Controller.FocusedRow.Values[col];
还是
cxTV.Controller.FocusedRow.DisplayTexts[col];
得到的都是包括隐藏列的值

后来有找了一下,发现以下这句才是

cxTableView.Controller.FocusedColumn.Index

唉~!FocusedColumnIndex 这个名字太有误导性了
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值