试下在数据集的状态改变时判断如果是dsEdit则把DBGrid改为只读,如果是dsInsert 则改只读为假

解决方案 »

  1.   

    “如果是dsEdit则把DBGrid改为只读”,
    那么整个dbgrid不就都变成只读了?我想要的是最新插入的记录可修改,其余的记录是只读!
    “如果是dsInsert 则改只读为假”,这样同样会导致插入一条记录而整个dbgrid都变成可修改的了,这样不行,我只想要新插入的那行可修改!
      

  2.   

    procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
    begin
      with DataSource1 do
        if not DataSet.Eof then
          DbGrid1.ReadOnly := DataSet.RecNo <> DataSet.RecordCount;
    end;
      

  3.   

    给DBGrid1的readonly属性赋值之后,是不是整个DBGrid1都变成只读或者可写了?
    这样的结果并不是我想要的!
      

  4.   

    经常向外弹出小窗口,可不是什么好行为:)总之,我重申:PowerBuilder的数据库窗口有一个功能,就是可以通过某种设置,使得只有通过程序新添加的行才能被用户修改,其它通过检索数据库得到的数据不能修改。我想在Delphi中实现相同的功能,请问在DbGrid里面如何才能做到只有新添加的行才能修改? 
      

  5.   

    那你最好还是别用DBGrid
    去下个第三方控件,如果愿意的话,自己写一个也行,到时想怎么样就怎么样!
    [写简单的控件我还会,写类似DBGrid的,我还没试过,呵呵:)]
      

  6.   

    给DBGrid1的readonly属性赋值之后,是不是整个DBGrid1都变成只读或者可写了?
    这样的结果并不是我想要的!你们之间有误解。如果你的焦点在新加的一行,那么能不能修改和grid得只读是一样的,为什么不是你想要的呢?既然焦点在你关心的那一行,即使grid属性为可编辑,你也不会碰到其他行的。细想,你的问题没有阐述清楚
      

  7.   

    设dataset的CachedUpdates为True
    然后在DBGrid的KeyDown中
    DBGrid1.ReadOnly :=  Table1.UpdateStatus <> usInserted;
    不过效果不太好
      
      

  8.   

    还是举个例子说得比较清楚:假设,有一个dbgrid,open的时候出来5行记录,现在我新插入一行,也就是说只有第6行才是新增记录。那么由于焦点随时都是可变的,比如单击第2条,焦点就转到第2行,但是由于第2行是从数据库检索出来的,因此我不希望这条记录可修改;但是如果单击第6条,焦点转到第6行以后由于第6行是新增的,因此我希望这条记录可修改。就是这样,该如何解决?
      

  9.   

    点击第6行时,可编辑,单击其它行时,不可编辑.
    用一个变量保存新insert的行号,然后,不用我说了吧.
    如果你一次只能insert一行,应该可以,如果insert多行,
    可能需要数组来保存了,post后把变量清空.
      

  10.   

    liu7537:你试试我的那个,有你说的那种效果
    不过好象有些毛病
      

  11.   

    DbGrid是cachedupdated,用户新插入一行之后,如果他这个时候用鼠标单击其它的行,这时候整个dbgrid的状态就变了,用户再回到新增加的行的时候,仍然是无法更新。换句话说,向dbgrid插入一行之后,无论用户怎么改变行焦点,新增的行应该始终是可修改;而其它行始终是只读。如果有人懂得PB,相信能够更好的理解我的需求。
      

  12.   

    在CachedUpdated为True时
    DBGrid1.ReadOnly :=  Table1.UpdateStatus <> usInserted;
    可以把这句放在DataSource的OnDataChange里,这样无论点击,还是按键都可以
    顺便说一句,我以前也用过一段时间pb,有些忘了
    我觉得好象pb也是根据这种更新状态的把