DXDBGRID :
我想用代码,动态添加 DXDBGRID 的列,并指定列的类型
因为表有100列,需要代码实现,列的类型大多是MASK,也有其他的如PICK指点!!

解决方案 »

  1.   

    procedure TfrmDayInput.AddTableField(tb : Tadotable);
    var ddarray,oilarray : array of string;
        i,j,k : integer;
        tmpFField : array of TFloatField;
        tmpSField : TStringField;
        idField,pfield : TSmallIntField;
        sAmount,sMoney : TFloatField;
    begin
      try
        with qrybase do
        begin
        //将油品和订单类型读入动态数组
          close;sql.clear;
          sql.add('select jmdd from tb_ddlx order by jmdd');
          open;
          setlength(ddarray,recordcount);
          for i := 0 to recordCount-1 do
          begin
            ddarray[i] := fields[0].value;
            next;
          end;      close;sql.clear;
          sql.add('select jmoil from tb_oil order by jmoil');
          open;
          setlength(oilarray,recordcount);
          for j:=0 to recordcount-1 do
          begin
            oilarray[j] := fields[0].value;
            next;
          end;      setlength(tmpFField,(i+1) * (j+1)+ 2*(j+1));      tmpSField := TStringField.Create(self);
          tmpSField.FieldName := 'sitename';
          tmpSField.Name := tmpSField.FieldName;
          tmpSField.DataSet := tb;
          sAmount := TFloatField.Create(self);
          sAmount.FieldName := 'sumamount';
          sAmount.Name := sAmount.FieldName;
          //sAmount.FieldKind := fkCalculated;
          sAmount.DataSet := tb;
          sMoney := TFloatField.Create(self);
          sMoney.FieldName := 'SumMoney';
          sMoney.Name := sMoney.FieldName ;
          //sMoney.FieldKind := fkCalculated;
          sMoney.DataSet := tb;      k := 1;
          for i := 0 to length(oilarray)-1 do
          begin
            for j:= 0 to length(ddarray)-1 do
            begin
              tmpFField[k] := TFloatField.create(self);
              tmpFField[k].FieldName := 'F_' + oilarray[i] + '_' + ddarray[j];
              tmpFFIeld[k].Name := tmpFField[k].FieldName;
              tmpFField[k].DataSet := tb;
              k := k + 1;
            end;
            tmpFField[k+1] := TFloatField.create(self);
            tmpFField[K+1].FieldName := 'F_' + oilarray[i] + '_price';
            tmpFField[K+1].Name := tmpFField[K+1].FieldName;
            tmpFField[k+1].DataSet := tb;
            tmpFField[k+1] := TFloatField.create(self);
            tmpFField[K+1].FieldName := 'F_' + oilarray[i] + '_KC';
            tmpFField[K+1].Name := tmpFField[K+1].FieldName;
            tmpFField[k+1].DataSet := tb;
          end;
          pField := TSmallIntField.Create(self);
          pField.FieldName := 'adjustPrice';
          pField.Name := 'adjustPrice';
          pField.DataSet := tb;
          idField := TSmallIntField.Create(self);
          idfield.FieldName := 'id';
          idfield.Name := 'id';
          idfield.DataSet := tb;    end;
        finally
          oilarray := nil;
          ddarray  := nil;
          tmpFField := nil;
        end;
    end;以前我写的一段代码,你看看吧。应该对你有点帮助。
      

  2.   

    if DxDbGrid1.ColumnCount=0 then
       begin
         adotemp1.Close;
         adotemp1.Open;
        DxDbGrid1.CreateDefaultColumns(adotemp1,nil);
       end;
      

  3.   

    用CreateColumnEx比较好,在创建之前判断是什么类型的Field,根据实际需要创建不同类型的Column
      

  4.   

    为什么我在一个线程里面动态往dxdbgrid中添加column时
    老出现很严重的错误,屏幕刷新也跟不上。
    出现如 list index of bound(1) 等东西
    请问是什么原因