zoukankan      html  css  js  c++  java
  • DXDBGrid使用方法

    http://www.cnblogs.com/gtsup/archive/2012/08/28/2660197.html

    dxDBGrid使用集锦

     

    一、如何设定可以多列自动排序?
        只能使用分组:如按a1,a2,a3,a4排序
        先按a1分组,再a2,再a3
        然后设置a4的排列(升/降)
    二、如何设定左边几列,不能滚动?
        建立Band0,Band1
        Band0的Fixed=tfLeft
        Band1的Fixed=tfnone
        设置要锁定的字段的BandIndex=0,其它为1
    三、如何访问,显示字段的对象,控制其可视与不可视?
       参看自带例程RunTimeCustomizing.dpr
    四、既然不能用readonly,那我用edgoEditing属性对吗?
       要想ReadOnly=True.我用edgoRowSelected=True;
    -------------------------------------------------------------------------------
    DXDBGRID有没有属性(如SORT等)可以实现:点击DXDBGRID的
    某个字段标题,就按这个标题排序?如果有,怎么用?
    呵呵。 楼上的。 你这样对待DXGRID 啊。 太痛苦了。

    DXGRID 设计排序和统计的关键前提是先指定 DXGRID 的KEY FIELD字段 然后设置它的 edgoAnsi Sort属性 为TRUE 就可以了.随便点任意字段都可以排序,如果还需要显示合计的话。 需要将edgoLoadAllRecords  设置为 True.
    不过需要注意 如果你做的是C/S编程,这意味着要从服务器上把所有符合条件的记录
    全部取回本地
    ------------------------------------------------------------------------------
    整理ExpressQuantumGrid控件心得如下:
      针对TdxDBGrid仅仅设置一些属性,就可以到达很好的效果:
     前提:先设置DataSource、ADODataSet、以及TdxDBGrid的属性后,设置ADODataSet的Active=true;然后才能在TdxDBGrid中的鼠标右键->
           column-> Add all Fields; 注意:一定要设置TdxDBGrid控件的属性keyField、并设置OptionsDB中edgoLoadAllRecord=true 。

     1、显示脚注栏: 设置属性showSummeryFooter=true即可。
     2、显示某一列的汇总值(或总个数): 设置summaryFooterType,为cstSum(或cstAvg)、并设置summaryFormat,即可。
     3、设置Filter:在TdxDBGrid属性中Filter组中Active=true。
     4、设置Sort:在OptionsBehavior中设置 :edgoAutoSort=true。
     5、设置汉字提示:在column中->SummaryFormat中输入样式,如:(数量=0.00)
     6、summary样式,一共分为三种:
        (1)summary:用于行的总体说明GroupNode类型。
        (2)summaryFooter:在整个Grid的底部footer处显示。
        (3)summaryRowFooter:在每个行的底部显示信息。(行,是几条记录形成的小组)。
    ------------------------------------------------------------------------------
    在DELPHI的标准控件中很容易的用
    grid.columns.add就可以加如一个列,但在DX控件中却不支持。
    WHY????????????????????/
     来自:sun77wind, 时间:2002-1-31 15:53:00, ID:898563 
    WHY?
    不知道,反正他就是不支持。我也在研究这个东东,怎么,交流交流?
     来自:sun77wind, 时间:2002-2-1 11:23:00, ID:900250 
    我找到了
      dxDBGrid1.CreateColumn(TdxDBGridMaskColumn);//TdxDBGridMaskColumn,列类型
      dxDBGrid1.Columns[4].FieldName := 'City';//4列索引,City字段名称
    出现

     来自:glbboy, 时间:2002-2-1 13:15:00, ID:900595 
    我就顺道问问,怎么让汇总的列自动跟着前面输入的变化。
    在keyup事件中,dbgShare.Fields[4].AsFloat:=
                   dbgShare.Fields[1].AsFloat*
                   dbgShare.Fields[2].AsFloat*
                   dbgShare.Fields[3].AsFloat;
    这样的话等输完它又变回去了,如果用Post先提交,那样的话整个输入又获得了焦点,继续输的时候又把输好的给覆盖了,总之很不爽,大家可以试试。而在其他事件中,又不是实时变化。
     
     来自:sun77wind, 时间:2002-2-1 16:23:00, ID:901144 
    你怎么不用计算字段呢?
      
    来自:glbboy, 时间:2002-2-1 18:27:00, ID:901471 
    在DBGRID事件BeforeScroll、ColExit两个事件中都加如下代码实现了汇总。
    qryShare.Edit;
    qryShare.Fields[4].AsCurrency:=qryShare.Fields[1].AsCurrency*
    qryShare.Fields[2].AsCurrency*qryShare.Fields[3].AsCurrency;
    qryShare.Post;
    但有一点不好,就是对数据库操作太多了。:)
    计算字段?有这个数据类型吗?说详细点OK!最好是给具体简单一点的代码!
     
    来自:china_peng, 时间:2002-2-1 18:39:00, ID:901499 
     不瞒你说,我搞了一天,曾经发过帖子;
    最后自己搞定了;
      with DXDBGRID1.CreateColumn(TdxDBGridMaskColumn) as TdxDBGridMaskColumn do
                  begin
                    FieldName := ClientDataSet3.Fields[Ifieldcount].FieldName;
                    HeaderAlignment := taCenter;
                     Width := 90;
    ------------------------------------------------------------------------------ 
     SaveToIni可以保存dxDBGrid的设置
    ------------------------------------------------------------------------------
    寒松大侠说的对!dxDbGrid + devPrintSystem 就可以了。 
    不改也可以打印!
    1.安装上devPrintSystem 控件。
    2.窗体上加入dxComponentPrinter控件,dxDBGrid控件。双击devPrintSystem 。
    加入一个dxComponentPrinter1Link,用来与dxdbgrid连接。dxComponentPrinter.Preview用来预览。Print用来打印。注意要设置dxdbgrid的keyfield,不然没有数据显示出来的。
     
    来自:hjandy, 时间:2002-6-3 15:58:00, ID:1140738 
    To :王寒松
    请教关于dxDBGrid的下述两个问题
    A:怎样在DefaultFields=True正常打印
    B:若预设dxDBGrid的DefaultFields=False,怎样在运行时动态加入栏位或组以及打印

    注:(1)数据表(DataSource)连接TClientDataSet
        (2)使用标题筛选Filter.Active=True
        (3)加入TdxComponentPrinter并设置

    若预设dxDBGrid的DefaultFields为True、edgoLoadAllRecords为True并加入KeyField值、设置上述(1)、(2)、(3)时,执行打印为空不能打印dxDbGrid内容
     
    ------------------------------------------------------------------------------
    在使用中发现了一个问题:
    有些时候,在grid中选中显示的数据(即光标定位的那一条记录)和数据源中当前的记录不匹配,而且出现这种情况随机的,应该和具体的属性设置没有关系。看看哪位兄台也遇上过类似的问题,麻烦赐教!

    来自:luozi, 时间:2002-1-30 17:24:00, ID:895998 
    cjf说的是syncSelection属性吧,在dxdbgrid的optiondb下。
    我以前的同事也遇到这个问题,不过如果不设KEYField属性好像就不会有这个问题了。
    关注。◎◎
     
     来自:fjnnz, 时间:2002-1-31 11:11:00, ID:897655 
    To luoji:  但是如果不设keyField,就不能使用LoadAllRecords属性,不使用LoadAllRecords属性,则排序,分组,筛选这些强大的功能都不能使用了,岂不是可惜的很?

    我前天也出了这个问题,经过检查,发现是keyfield设置成了一个非唯一的字段造成的,把keyfield设置成唯一的字段就不会了,不一定是主码,只要是唯一就行了,随即出现不能locate估计是当locate的时候,找出来的是keyfield,所以就停留在第一个keyfield和locate相同的那一条记录中了
     
     来自:mjy97, 时间:2002-2-6 12:53:00, ID:910760 
    条件:
    一、keyfield设置为唯一值字段
    二、LoadAllRecords:=True 
    ------------------------------------------------------------------------------
    我在dxDBGrid中,在dxDBGrid1DQPZH列中的ONValidate事件中,怎样取得我刚输入的值,
    我用dxDBGrid1DQPZH.Field.OldValue或dxDBGrid1DQPZH.Field.NewValue,均取得没修改
    以前的值。

    这个事件确实有问题,我的解决办法是在dxDbGrid的OnEdited中编程,代码如下
    新值: dxDBGrid1.FocusedField.NewValue
    旧值: dxDBGrid1.FocusedField.OldValue 
     
     来自:caodz, 时间:2002-3-1 16:06:00, ID:952000 
    在dxDBGrid1ChangeColumn事件中,写
    X:=dxDBGrid1DQPZH.Field.TEXT
     
    ------------------------------------------------------------------------------
    dxDBGrid怎样用代码动态增加列,
    搞定了
     with dxDBGrid1.CreateColumn(TdxDBGridButtonColumn) as TdxDBGridButtonColumn do
      begin
        FieldName := 'NAME';
      end;
    ------------------------------------------------------------------------------
    dxdbGrid的状态栏中的汇总结果,当添加新的记录的时候,不能刷新
    怎么办?应该在那里再进行一次汇总调用?
    将LoadAllRecord 设为true即可.

    ------------------------------------------------------------------------------
     dxDBGrid的继承关系是:
      TWinControl-->TCustomControl-->TCustomdxContainer -->TCustomdxTreeList-->TCustomdxDBTreeListControl
      -->TCustomdxDBGrid-->TdxDBGrid
    ------------------------------------------------------------------------------
    dxDBGrid如何固定某列不左右移动?
    options下的egoColumnMoving设为false
    ------------------------------------------------------------------------------
    如何知道当前DXDBGRID的行号和列号
    列号和列名
    我是说DXDBGRID不是DBGRID

     来自:萧月禾, 时间:2002-5-22 14:11:00, ID:1116753 
      dxDBGrid.FocusedNode.Index
      dxDBGrid.FocusedColumn

     来自:小草, 时间:2002-5-22 14:30:00, ID:1116803 
    大哥请问如何为坐标为(2,3)行号和列号的DXDBGRID赋值?
      
    来自:萧月禾, 时间:2002-5-22 14:47:00, ID:1116846 
    DXDBGRID的内容是反映其关联的数据集的数据 取数据的话可以dxDBGrid.Items[2].Values[3] 但好象不能直接通过程序给它赋值(手工可以) 要用程序赋值只能对其数据集处理
    给RecNo属性等于2的数据集的第2个字段赋
    如在一个循环判断中
      ADOTable1.First;
      while not ADOTable1.Eof do
      begin
        if ADOTable1.RecNo = 2 then
          ADOTable1['字段二'] := 'abc';
        ADOTable1.Next;
      end;
     
    来自:zhanzehua, 时间:2002-5-22 15:22:00, ID:1116923 
    ADOTable1.RecNo :=2;{记录到第二行}
    ADOTable1.Fields[2] :=?? {修改第三列}
    ------------------------------------------------------------------------------
    dxDBGrid如何知道现在在哪一列?哪一个单元格?DBGrid有SelectedIndex,dxDBGrid是何相关属性?
        dxDBGrid1.FocusedColumn
    ------------------------------------------------------------------------------
    dxDBGrid如何用回车键、代替Tab键来移动栏位
    在form的keypress事件下添加如下代码就可以了:
    if key=#13 then
    if (activecontrol is tdbgrid ) then
    begin
     with tdbgrid(activecontrol) do
    if selectedindex<(fieldcount-1) then
    selectedindex:=selectedindex+1
    else
    selectedindex:=0;
    end;

    首先设置Form的KeyPreview属性为True
    然后
    在form的keypress事件下添加如下代码就可以了:
    if key=#13 then
    if (activecontrol is tdbgrid ) then
    begin
     with tdbgrid(activecontrol) do
       if selectedindex<(fieldcount-1) then
       selectedindex:=selectedindex+1
     else
     begin
       dbgrid1.DataSource.DataSet.Next ;
       selectedindex:=0;
     end;

    ------------------------------------------------------------------------------
    DxDBGrid的GroupPanel上面的英文[Drag a column header to group by that column]怎么可以改成中文?
    源码包里有 RC 文件。  打开他。翻译成中文。 然后brcc32  -r *.rc 然后把生成RES 文件放到DELPHI的LIB PATH 中路径里就可以了
    ------------------------------------------------------------------------------
    就是在任何一个单元格是双击后就可以知道那个单元在哪一个column(列)中,以运行不同的代码。
    以前用DBGRID,可以在DBGrid1CellClick中获取该信息,但在DXDBGRID中如何做呢?而且我想要
    双击时,不是单击的时候根据Index就可以取得Caption啊:
    dxDBGrid1.FocusedNode.Strings[dxDBGrid1.FocusedColumn]
    至于会不会变你试一下就行了,用上面的这句应该没有问题的。
    ------------------------------------------------------------------------------
    dxDBgrid多选,遍历每条选中记录,将字段Name内容改为Str的内容
        if InputQuery('刊物名称输入','请输入新的刊物名称:',Str) then
          with dxDBGrid1.DataSource.DataSet do
          begin
            for I:=0 to dxDBGrid1.SelectedCount-1 do
            begin
              GoTobookmark(pointer(dxDBGrid1.SelectedRows[i]));
    //          Edit;
    //          FieldByName('Name').AsString := Str;
    //          Post;
            end;
          end;
    到第二个循环的GoTobookmark(pointer(dxDBGrid1.SelectedRows[i]));就'List Index out of bounds(1)'。

    以前得我都看了,好像没有改记录内容的。

            for I:=0 to dxDBGrid1.SelectedCount-1 do
            ->for i := dxDBGrid1.SelectedCount - 1 downto 0 do
    ------------------------------------------------------------------------------
    在DXDBGRID中,根据某字段的值而决定该行的颜色,类似DBGRID的DRAWDATACELL事件怎么写
    第一个问在dxdbgrid中oncustomdrawcell事件写
     if  ASelected then afont.Color:=clred;          //选中的栏的字体设为红色
      scheck:=ANode.Values[dxDBGrid1status.Index];  //dxdbgrid1status为某一个指定字段
      if not VarIsNull(scheck) then
        if scheck = '1' then                       //这段为指定值的判定,如果为1把这一行定义为白颜色
                                
            AColor := clWhite
         else
            acolor:=clInfoBk;
            
    ------------------------------------------------------------------------------
    在DXDBGRID控件中,有过滤功能,很方便。但现在却出现一问题,
    如果我在程序中用过滤锁定一条记录后,如果重新关闭并激活数据源,
    此时用QUERY.FIELDBYNAME('AAA').ASSTRING返回的结果不是激活数据源前的记录,
    必须手工用鼠标指向其它行或列时才会返回光标指向的记录。如何解决?
      
    来自:doud, 时间:2001-3-30 14:39:00, ID:486077 
    不明白?你要返回关闭前的记录,在关闭前记往好了
     
     来自:simonlai, 时间:2001-3-30 15:57:00, ID:486180 
    首先你跟蹤看看﹐你關閉之前是不是鎖定就是你當前所要的記錄﹖
    如果是把關鍵字段保存在一個變量里﹐然后用
    很笨的方法﹐就是進行Talbe.locate('Field',變量,[]);
    就可以找到關閉前所要的記錄﹗
      
    来自:暖风, 时间:2001-3-30 16:06:00, ID:486194 
    var
       SavePlace: TBookmark;
       PrevValue: Variant;
    begin
       with Table1 do
       begin
        { get a bookmark so that we can return to the same record }
        SavePlace := GetBookmark;  
        { move to prior record}
        FindPrior; 
        { get the value }
        PrevValue := Fields[0].Value;
        {Move back to the bookmark} 
        GotoBookmark(SavePlace);
        { Set the value }
        Fields[0].Value := PrevValue;
        { Free the bookmark }
        FreeBookmark(SavePlace);
      end;
    end;

    ok!:)
     
     
    ------------------------------------------------------------------------------
    用过 dxDBGrid 的大侠看过来,拖动字段分组后,怎样将指定的组中的全部行选中 ( 积分:100, 回复:3, 阅读:42 )
    分类:控件 - 使用 ( 版主:amo, cAkk )  
    来自:mytsin, 时间:2001-6-7 14:09:00, ID:557591 [显示:小字体 | 大字体]  
    比如:a,90;a,91;a92;b,80;b85 分组后成了

        90
        91
        92
    b
        80
        85
    我想将 b 组的数据选中。
     
    来自:wind_cloudy, 时间:2001-6-7 14:42:00, ID:557645 
    设置dxDbgrid的OptionsBehavior属性的edgoMultiSelect为true
    设置dxDbgrid的OptionsView属性的edgoRowSelect为true
    按住ctrl或shift键,用鼠标选择.
     
    ------------------------------------------------------------------------------
    如何在DXDBGRID(DEV EXPRESS中的一个控件)中在列标题上出现排序的小箭头?
      
    来自:Slong, 时间:2001-2-8 10:28:00, ID:451611 
    The ExpressQuantumGrid performs sorting automatically if the egoLoadAllRecords and egoAutoSort options (options property) are active.  If you wish to incorporate multiple column sorting (available with egoLoadAllRecords set to
    True), all you must do is to activate the egoMultiSort option (the OptionEx property). 

    You have to write your own code within the OnColumnClick event to sort the ExpressQuantumGrid if it is not in LoadAllRecords mode.  For additional information, see the ExpressQuantumGrid Objects and Components reference.
    以上是DXDBGRID的帮助中有关排序的说明,也就是有两中方法去实现你的目的:
      1. 设置OptionsBehavior.egoLoadAllRecords 和 OptionsDB.egoAutoSort属性为True 就可以,不过我试了一下,要指定KeyField属性的值才有效。
      2. 在OnColumnClick事件中加入你的排序方法,以下是它的Demo中的代码:
    with TdxDBGrid(Sender) do
      begin
        OldSorted := Column.Sorted;
        if (GetAsyncKeyState(VK_SHIFT) = 0) then
          TdxDBGrid(Sender).ClearColumnsSorted;

        if OldSorted = csUp then
          Column.Sorted := csDown
        else
          Column.Sorted := csUp;

        with TQuery(DataSource.DataSet) do
        begin
          ID := FieldByName('ID').AsInteger;
          DisableControls;
          try
            Close;
            SQLOrderSt := '';
            for i := 0 to SortedColumnCount - 1 do
            begin
              if SQLOrderSt <> '' then
                SQLOrderSt := SQLOrderSt + ', ';
              SQLOrderSt := SQLOrderSt + GetFieldName(SortedColumns[i]);
              if SortedColumns[i].Sorted = csDown then
                SQLOrderSt := SQLOrderSt + ' DESC';
            end;
            if SQLOrderSt <> '' then
              SQLOrderSt := 'ORDER BY ' + SQLOrderSt;
            SQL.Strings[SQL.Count - 1] := SQLOrderSt;
            Open;
            Locate('ID', ID, []);
          finally
            EnableControls;
          end;
        end;
      end;
    由此我们可看到它是用动态SQL语句重新ORDER BY记录了。

    ------------------------------------------------------------------------------
    各位大侠帮帮忙!急需的,我用CreateColumn方法不行,怎么办?
      
    来自:hpretty, 时间:2002-5-31 10:00:00, ID:1134606 
    这是我的源码,你自己看着改一下就可以的!
    procedure CreatedxGridColumn(dxGrid: TdxDBGrid);
    var
      I,J,K: integer;
      C: TdxDBTreeListColumnClass;
      lFieldInfo:TFieldDictInfo;
      daqLookup:TQuery;
      D:TdxDBGridPickColumn;
      sLookField,sSQL:String;
      lSQLParser:TSQLAnalysis;

      function GetListColumnsClass(AField: TField;DataSet:TDataSet): TdxDBTreeListColumnClass;
      var
        lFieldInfo:TFieldDictInfo;
        lSQLParser:TSQLAnalysis;
      begin
        lSQLParser:=TSQLAnalysis.Create;
        lSQLParser.SQLString:=(DataSet as TQuery).SQL.Text;
        try
          if AField.FieldKind = fkLookup then
            Result := TdxDBGridLookupColumn
          else begin
            if AField.FieldKind = fkData then begin
              case AField.DataType of
                ftBoolean : Result := TdxDBGridCheckColumn;
                ftDate, ftDateTime : Result := TdxDBGridDateColumn;
                ftTime : Result := TdxDBGridTimeColumn;
                ftCurrency : Result := TdxDBGridCurrencyColumn;
                ftGraphic : Result := TdxDBGridImageColumn;
                ftBytes, ftVarBytes, ftBlob, ftMemo,
                  ftFmtMemo, ftParadoxOle, ftDBaseOle, ftTypedBinary :
                    Result := TdxDBGridBlobColumn;
                else
                  lFieldInfo := DBDictInfo.FindFieldDictInfo(AField.FieldName,lSQLParser.Froms);
                  if (lFieldInfo.LookupTable <> '') and (not AField.ReadOnly) then Result := TdxDBGridPickColumn
                  else Result := TdxDBGridColumn;
              end;
            end else
              Result := TdxDBGridMaskColumn;
          end;
        finally
          lSQLParser.Free;
        end;
      end;

    begin
      if dxGrid.DataSource = nil then Exit;
      if dxGrid.DataSource.DataSet.FieldCount < 1 then exit;
      if dxGrid.KeyField = '' then
        dxGrid.KeyField := dxGrid.DataSource.DataSet.Fields[0].FieldName;

      for I := 0 to dxGrid.DataSource.DataSet.FieldCount - 1 do
      begin
        if not dxGrid.DataSource.DataSet.Fields[I].Visible then Continue;
    //显示MEMO字段,Modified by Xufeng
        //    if (GetListColumnsClass(dxGrid.DataSource.DataSet.Fields[I],dxGrid.DataSource.DataSet) = TdxDBGridBlobColumn) then Continue;

        C := TdxDBTreeListColumnClass(GetListColumnsClass(dxGrid.DataSource.DataSet.Fields[I],dxGrid.DataSource.DataSet));
        if C <> nil then
        begin
          with dxGrid.CreateColumn(C) do
          begin
            FieldName := dxGrid.DataSource.DataSet.Fields[I].FieldName;
       //判断是否从另一个表里取数据
            if C = TdxDBGridPickColumn then
            begin
              D := TdxDBGridPickColumn(dxGrid.ColumnByFieldName(dxGrid.DataSource.DataSet.Fields[I].FieldName));
              lSQLParser:=TSQLAnalysis.Create;
              lSQLParser.SQLString:=(dxGrid.DataSource.DataSet as TQuery).SQL.Text;
              try
                lFieldInfo := DBDictInfo.FindFieldDictInfo(dxGrid.DataSource.DataSet.Fields[i].FieldName,lSQLParser.Froms);
                if lFieldInfo.LookupTable <> '' then
                begin
                  daqLookup := TQuery.Create(nil);
                  try
                    K := Pos(';',lFieldInfo.LookupFieldsString);
                    if K=0 then sLookField := lFieldInfo.LookupFieldsString
                    else sLookField := Copy(lFieldInfo.LookupFieldsString,1,K-1);
                    sSQL := 'Select ' + sLookField + ' from ' + lFieldInfo.LookupTable;
                    if lFieldInfo.RangeField <> '' then sSQL := sSQL + ' where ' + lFieldInfo.RangeField + '=''' + lFieldInfo.RangeValue + '''';

                    daqLookup.SQL.Add(sSQL);
                    daqLookup.DatabaseName := GlobalInfos.DataBaseName;
                    daqLookup.Open;
                    for J := 1 to daqLookup.RecordCount do begin
                      D.Items.Add(daqLookup.FieldByName(sLookField).AsString);
                      daqLookup.Next;
                    end;
                  finally
                    daqLookup.Free;
                  end;
                end;
              finally
                lSQLParser.Free;
              end;
            end;
          end;
        end;
      end;
    end;

     ------------------------------------------------------------------------------
    DxDBGrid中哪个属性等价于DbGrid的”ReadOnly”属性.如果没有应该怎样设置
    OptionBehavior中Edgoediting 设成False
    或者将Optionview中的edgorowselect 设成true

  • 相关阅读:
    IntelliJ IDEA 常用快捷键
    solr4.5分组查询、统计功能介绍
    用于Lucene的各中文分词比较
    Lucene打分规则与Similarity模块详解
    Lucene
    tar中的参数 cvf,xvf,cvzf,zxvf的区别
    tmux 入门踩坑记录
    第一个shell脚本
    make 和 make install 的区别
    交叉编译
  • 原文地址:https://www.cnblogs.com/westsoft/p/5968351.html
Copyright © 2011-2022 走看看