var
  count,fori,fontSize,AverageWidth : Integer;
begin
  count := DBGrid.Columns.Count;
  AverageWidth :=DBGrid.ClientWidth div count;  for fori := count-1 downto 0 do
  begin
    DBGrid.Columns.Items[fori].Title.TitleButton := True;
    case fori of
      0,6..9 : fontSize := 8;
      1..4   : fontSize := 2;
    else
      fontSize := 4;
    end;
    DBGrid.DataSource.DataSet.Edit;////这里报错:cannot modify a read-only dataset    DBGrid.DataSource.DataSet.Fields.Fields[fori].DisplayWidth := AverageWidth div fontSize;
    DBGrid.DataSource.DataSet.FieldByName('题名').Text :='突突突';
    DBGrid.DataSource.DataSet.Next;
  end;
end;问题:我想逐行把dbgrid里一个列的数据修改修改,然后赋值进去,但不改数据库.
怎么做呀?

解决方案 »

  1.   

    read-only ?你把是数据集设置成只读了
      

  2.   

    也不一定是设置了只读
    有的数据集返回就是只读的,比如含有join等
      

  3.   

    dbGrid 显示的数据,其实就是 AdoQuery(或者 Query)
    你想改某一列,其实就是修改某一个字段,循环数据集,对该字段赋值,然后 Post
    将AdoQuery 的 Lock Type 属性,设置成 ltBatchOptimistic,这样 Post 就不会存入数据库了
      

  4.   

    DBSet.Recordset := P_DB.Execute(MultiSql,cmdText);    dsDBSet.Active := True;
        DBGrid.SumList.Active := True;然后就执行上面的方法了.
      

  5.   

     P_DB              : TADOConnection;
      

  6.   

    如果不修改数据的话,我认为应该自定义DrawColumnCel事件才行,参考:
    http://jian100305.host10.web-75.com/tech/questionlist.asp?q_ID=6
      

  7.   

    我sql语句里的确含有: INNER JOIN  的句子
      

  8.   

    DBgrid我没设置readonly,如果注释了//DBGrid.DataSource.DataSet.Edit;
    就提示Dataset not in edit or insert mode
      

  9.   

    不行呀,我在ondraw的时候还报错:  Dataset not in edit or insert mode
    procedure TfrmPaySearch.DBGridDrawColumnCell(Sender: TObject;
      const Rect: TRect; DataCol: Integer; Column: TColumnEh;
      State: TGridDrawState);
      var
        i:Integer;
    begin
      DBGrid.DataSource.DataSet.FieldByName('题名').Text :='突突突';
    end;
      

  10.   

    我昨天又测试了一下使用query组件可以显示,代码是:
    TForm1 = class(TForm)
        DBGrid1: TDBGrid;
        DataSource1: TDataSource;
        ADOQuery1: TADOQuery;
    ////////////
      ADOQuery1.Close;
      ADOQuery1.ConnectionString:=   'Provider=SQLOLEDB.1;Password=sa;Persist Security Info=True;User ID=sa;Initial Catalog=ttt;Data Source=(local)';
      ADOQuery1.SQL.Clear;
      ADOQuery1.SQL.Add('SELECT Log   FROM Tab    ');
      ADOQuery1.Open;
      ADOQuery1.Edit;
      ADOQuery1.fieldbyname('Log').Text:='666';但如果使用ADODataSet1就不行,老报错
      ADOConnection1.ConnectionString:=   'Provider=SQLOLEDB.1;Password=sa;Persist Security Info=True;User ID=sa;Initial Catalog=ttt;Data Source=(local)';
      ADODataSet1.Recordset:=ADOConnection1.Execute('SELECT Logw   FROM Tab');
      ADODataSet1.Open;
      ADODataSet1.Edit;
      ADODataSet1.FieldByName('Log').Text:='666';
      DBGrid1.Fields[0].Text:='ddddddd';
    可我的程序一直使用的ADODataSet,我要改为adoquery怕引起程序其他问题.
    有什么好方法呀
      

  11.   

    设置
    Options.RequiredFields:=False;
    这样读取数据库到客户端,就不回把相关字段属性读出来了。
      

  12.   

    read-only 你把是数据集设置成只读了.
    设置
    Options.RequiredFields:=False;
    这样读取数据库到客户端,就不回把相关字段属性读出来了。
      

  13.   

    Options.RequiredFields:=False;
    各位老大,这句话是谁的属性?
    DBGrid1  ,ADODataSet1,ADOConnection1 他们3人都没有option属性,也没有RequiredFields属性呀?
    代码往哪里加呀?下面是我的代码:
      DBGrid1.ReadOnly:=False;
      ADOConnection1.ConnectionString:=   'Provider=SQLOLEDB.1;Password=sa;Persist Security Info=True;User ID=sa;Initial Catalog=YXLibraryDB;Data Source=(local)';
      ADODataSet1.Recordset:=ADOConnection1.Execute('SELECT id  FROM MainBiblioTab where UnitNum is not null and len(UnitNum)>2');
      Options.RequiredFields:=False;
      ADODataSet1.CanModify:=True;
      ADODataSet1.Open;    //adodataset就是不能修改文字.
      ADODataSet1.Edit;
      ADODataSet1.FieldByName('id').Text:='666';
      

  14.   

    with DBGrid.DataSource.DataSet do
    begin
      Edit;
      FieldByName('题名').AsString := '凸凸凸';
      Post;
      Edit;//这句看情况可以添加进去
    end;
      

  15.   

    with DBGrid.DataSource.DataSet do
    begin
    Edit;  ///这里根本就不让编辑.............会报不可modify错误的..
    FieldByName('题名').AsString := '凸凸凸';
    Post;
    Edit;//这句看情况可以添加进去
    end;
      

  16.   

    投降了,使用ADOdataset不可能可以修改dbgrid,如果那位老大实现了,给把代码贴出来吧.
    投降了,只能使用ADOquery实现了.
    完美的解决方案如下:unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ADODB, DB, Grids, DBGrids;type
      TForm1 = class(TForm)
        DBGrid1: TDBGrid;
        DataSource1: TDataSource;
        ADOQuery1: TADOQuery;
        ADOStoredProc: TADOStoredProc;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
      MultiSql:WideString;
      PageCurrent,PageSize,RowNum,PageCount,SumCount:Integer;
      AddParam : TParameter;
    begin
      ADOStoredProc.Close;
      ADOStoredProc.ConnectionString :='Provider=SQLOLEDB.1;Password=sa;Persist Security Info=True;User ID=sa;Initial Catalog=ttt;Data Source=(local)';
      begin
        ADOStoredProc.Parameters.Clear;
        ADOStoredProc.ProcedureName := 'sp_PageView;1';    AddParam := ADOStoredProc.Parameters.AddParameter;
        AddParam.Name := '@sql';
        AddParam.DataType := ftWideString;    AddParam := ADOStoredProc.Parameters.AddParameter;
        AddParam.Name := '@PageCurrent';
        AddParam.DataType := ftInteger;    AddParam := ADOStoredProc.Parameters.AddParameter;
        AddParam.Name := '@PageSize';
        AddParam.DataType := ftInteger;    AddParam := ADOStoredProc.Parameters.AddParameter;
        AddParam.Name := '@PageCount';
        AddParam.DataType   := ftInteger;
        AddParam.Direction  := pdInputOutput;    AddParam := ADOStoredProc.Parameters.AddParameter;
        AddParam.Name := '@SumCount';
        AddParam.DataType   := ftInteger;
        AddParam.Direction  := pdInputOutput;
      end;
      MultiSql:='SELECT * FROM ttt';
      PageCurrent:=1;
      PageSize:=3;
      RowNum:=1;
      ADOStoredProc.Parameters.ParamByName('@sql').value:= MultiSql;
      ADOStoredProc.Parameters.ParamByName('@PageCurrent').value:= PageCurrent;
      ADOStoredProc.Parameters.ParamByName('@PageSize').value:= PageSize;
      ADOStoredProc.Open;
      try
      PageCount := ADOStoredProc.Parameters.ParamByName('@PageCount').Value;
      except
      PageCount := -1;
      end;
      try
      SumCount := ADOStoredProc.Parameters.ParamByName('@SumCount').Value;
      except
      SumCount := -1;
      end;
      //ShowMessage(IntToStr(PageCount)+inttostr(SumCount));  ADOQuery1.Recordset := ADOStoredProc.NextRecordset(RowNum);
      ADOStoredProc.Close;  begin//专门管修改dbgrip的显示内容的
        ADOQuery1.Open;
        ADOQuery1.Edit;
        ADOQuery1.fieldbyname('id').Text:='666';
      end;  end;
    end.
      

  17.   

    其中dbgrip组件链接datasource
    datasource链接adoquery
    adoquery对ADOStoredProc的连接在代码里写.