颈椎曲度变直怎么治好:大富翁论坛-富翁笔记-CxGrid使用小结

来源:百度文库 编辑:偶看新闻 时间:2024/04/29 08:09:35
cxGrid功能强大,适合做企业级的复杂查询。非常方便。
但是对其用法介绍的并不多,在此总结他人的使用经验和自己的一点小经验,供大家参考。

(1)动态设置显示格式
procedure SetDisplayFormat(ACtrlData: TClientDataSet;
  TbView: TcxGridDBTableView);
var
  i: integer;
begin
  if ACtrlData.RecordCount <= 0 then Exit;
  try
    TbView.ClearItems;
    ACtrlData.First;
    for i := 0 to ACtrlData.RecordCount - 1 do
    begin
      if ACtrlData.FieldByName('SQBF_DisplayInGrid').AsString = '1' then //在表格中显示
      with TbView.CreateColumn do
      begin
        DataBinding.FieldName := ACtrlData.FieldByName('SQBF_FieldName').AsString;
        Caption := ACtrlData.FieldByName('SQBF_Caption').AsString; //字段中文标题
        Hint := ACtrlData.FieldByName('SQBF_Hint').AsString;
        Width := ACtrlData.FieldByName('SQBF_Width').AsInteger;
        HeaderAlignmentHorz := taCenter;
      end;
      ACtrlData.Next;
    end;
  except
    on E: Exception do
      SaveLog('设置显示格式时出错:' + E.Message);
  end;
end;

(2)显示行号
procedure TFmQueryBase.cxDBViewMasterCustomDrawIndicatorCell(
  Sender: TcxGridTableView; ACanvas: TcxCanvas;
  AViewInfo: TcxCustomGridIndicatorItemViewInfo; var ADone: Boolean);
var
  FValue: string;
  FBounds: TRect;
begin
  FBounds := AViewInfo.Bounds;
  if (AViewInfo is TcxGridIndicatorRowItemViewInfo) then
  begin
    ACanvas.FillRect(FBounds);
    ACanvas.DrawComplexFrame(FBounds, clBlack, clBlack, [bBottom, bLeft, bRight], 1);
    FValue := IntToStr(TcxGridIndicatorRowItemViewInfo(AViewInfo).GridRecord.Index+1);
    InflateRect(FBounds, -3, -2); //Platform specific. May not work on Linux.
    ACanvas.Font.Color := clBlack;
    ACanvas.Brush.Style := bsClear;
    ACanvas.DrawText(FValue, FBounds, cxAlignCenter or cxAlignTop);
    ADone := True;
  end;
end;
(3)设置显示格式,我的项目要求先动态添加字段,这时不知道字段类型,所以设置DisplayFormat不方便,我还没有找到好方法。
所以采用打开数据集后再设置:
procedure TFmQueryBase.cdsMasterAfterOpen(DataSet: TDataSet);
var
  i: Integer;
begin
  for i := 0 to cxDBViewMaster.DataController.DataSet.FieldCount -1 do
  begin
    if cxDBViewMaster.DataController.DataSet.Fields[i] is TNumericField then
    begin
      if Pos('AMOUNT', UpperCase(cxDBViewMaster.DataController.DataSet.Fields[i].FieldName)) > 0 then
      begin
        TNumericField(cxDBViewMaster.DataController.DataSet.Fields[i]).DisplayFormat := '#,##0.000';
        Continue;
      end;
      if Pos('QUANTITY', UpperCase(cxDBViewMaster.DataController.DataSet.Fields[i].FieldName)) > 0 then
      begin
        TNumericField(cxDBViewMaster.DataController.DataSet.Fields[i]).DisplayFormat := '#,##0.000';
        Continue;
      end;
       if Pos('MONEY', UpperCase(cxDBViewMaster.DataController.DataSet.Fields[i].FieldName)) > 0 then
      begin
        TNumericField(cxDBViewMaster.DataController.DataSet.Fields[i]).DisplayFormat := '#,##0.00';
        Continue;
      end;
   end;
  end;
end;
2007-7-19 12:48:54    查看评语»»»     2007-7-19 12:53:09    别人的,转载

http://www.showding.cn/item/cxGrid__182526.aspx

最近在学习使用cxGrid,安装的版本是ExpressQuantumGrid   Suite   v5.10  
  我发现这个控件功能虽然强大,但是非常难用。  
   
  现在我手头就有几个问题还没解决:  
  1)主从模式下导出Excel中文会产生乱码,而且从表内容没有导出。  
  我不知道是不是因为我的字段名包括单引号的原因。  
  导出代码:ExportGrid4ToExcel(FileName,   cxGrid);  
   
  2)主从模式下通过按钮对从表添加/删除行,代码怎么写。  
  附:单表添加/删除行的代码  
  procedure   TFormAccount.cxButtonNewClick(Sender:   TObject);  
  begin  
      Self.tvAccount.DataController.Append;  
      Self.tvAccount.Columns[0].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.Levels[0].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.Levels[0].GridView);  
      GridView.DataController.KeyFieldNames   :=   'VendorID';  
      GridView.OptionsView.GroupByBox   :=   False;  
   
      //显示主表内容  
      tvResult.BeginUpdate;  
      tvResult.ClearItems;  
      tvResult.DataController.CreateAllItems;  
      tvResult.EndUpdate;  
   
      //显示明细表内容  
      GridView   :=   TcxGridDBTableView(cxGrid1.Levels[0].Items[0].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:

  2007-7-19 12:56:41    go on

订单号 商品名 单价 数量 金额
001 aa 11.00 2 22.00
001 bb 2.00 2 4.00
001 cc 3.00 3 9.00

----------------------合计 7 35.00

002 ee 11.00 2 22.00
002 bb 3.00 2 6.00
002 cc 3.00 3 9.00

----------------------合计 7 37.00


总计14 72.00

每个单号分一个小结,能实现吗?

最后在底下实现总的合计

 
 
 
 回复人:dctony() ( ) 信誉:100 2007-1-12 21:48:23 得分:100
 
 

可以的,cxGrid的功能比你想象的还要强大。
1.你先放一个cxGrid,设置好View,设置View.DataController连接的DataSource
2.激活DataSource连接的DataSet,双击cxGrid,点击Retrieve Fields,取得所有的Column
3.设置View的OptionsView.Footer=True,OptionsView.GroupFooters=True,这是为了把分组小计和总计面板显示出来
4.将“订单号”字段拖到cxGrid上方的分组面板(GroupbyBox),将数据按“订单号”分组。这时你会发现单身所有的数据都缩起来了,如果想使所有的数据都展开,可以设置View.DataController.Options.dcoGroupsAlwaysExpanded=True
5.设置分组小计:把View.DataController.Summary.DefaultGroupSummaryItems点开,新增一个Item,Column属性在下拉里选择“数量”字段,FieldName属性为空,Format属性可以设置数值的显示格式,Kind属性下拉skSum加总,Position属性一定要选择spFooter。
6.设置总计:把View.DataController.Summary.FooterSummaryItems点开,新增一个Item,Column属性在下拉里选择“数量”字段,FieldName属性为空,Format属性可以设置数值的显示格式,Kind属性下拉skSum加总,Position属性一定要选择spFooter。
大功告成,按F9看一下胜利果实吧。

再奉送一个技巧,在Form1再放一个TcxGridPopupMenu控件,就在cxGrid控件旁边的那个,把TcxGridPopupMenu的Grid属性设置成你的cxGrid。
然后运行程序,在运行状态,点击Grid上的所有地方,左键或右键,你都会有意外收获。

ExpressQuantumGrid控件实在是太复杂,太庞大,最好的了解它的方法就是查帮助。