dxDbgrid如何对选中的多行进行操作

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值