我要管理一个表的数据,于是我采用了一个DBEdit,一个DBNavigator,一个DBGrid,3个都关联到一个DataSource,这样可以通过DBNavigator使DBEdit与DBGrid显示数据同步。我只允许编辑DBEdit,但不允许在DBGrid编辑。
    但是在点击DBNavigator的添加按钮时,出现了问题。如果DBGrid有某个单元格获得焦点,点击添加按钮,会在DBGrid产生空行,也会清空DBEdit,DBGrid的新加空行的相应单元格会获得焦点。然后我想在DBEdit里面输入新数据,我点击DBEdit,DBGrid的新加的空行没有了,被下一行记录代替,此时没有单元格获得焦点。如果再次点击添加按钮,会重新生成空行并清空DBEdit,这次可以在DBEdit录入新数据,而不会出现上面的问题。
    该如何解决这个问题呢?
    我尝试把DBGrid的Enable设为false,可是显示不美观,垂直滚动条不可用
    hahafan(注意!此人前途迷茫) ,指导在Grid的OnEnter事件加ActiveControl := nil,但是垂直滚动条还是不可用。
    我尝试把DBGrid1.SelectedRows.Clear;还是无法去掉焦点。
    有没有办法让DBGrid没有单元格获得焦点,但是垂直滚动条可以用,就像上面第二次点击添加按钮时的状态?

解决方案 »

  1.   

    设置DBGrid整行全选,改成只读属性不就可以了吗?
      

  2.   

    设置 DBGrid.ReadOnly := True  应该可以吧
      

  3.   

    设置readonly:=true,只是不能编辑了,如果点击单元格,单元格还是可以获得焦点
      

  4.   

    to  52768361(涵清V3.0) 
     可以说具体点吗?我感觉不是几个DataSource的问题
      

  5.   

    在DBGRID的Option属性里面把dgEditing的值设为false就行了
      

  6.   

    1。产生这种情况的原因:
    dbgrid在失去焦点的时候自动执行了数据集的Cancel命令
    所以你选中dbgrid后,insert,焦点再转到dbedit,即执行了cancel,你新加的行当然没有了。
    你再次点添加,这时焦点不在dbgrid,所以没有执行cancel2.解决办法
    dbgrid-option-dgCancelOnExit 设为falseps 有时间的话自己用button控制,DBNavigator不方便
      

  7.   

    to  merkey2002(小样的) 
    你分析的非常对。
    我的解决方法如下:
    procedure TVendorInputForm.DBGrid1CellClick(Column: TColumn);
    begin
    edtName.SetFocus;
    end;
    这样每次点击单元格,焦点会跑到外面的一个控件上。同时让DBGrid的Tabstop为false,这样就避免了第一次显示的时候DBGrid获得焦点
      

  8.   

    经过比较,我觉得merkey2002(小样的) 的方法使用起来更简单。非常感谢!也谢谢所有发言的朋友,马上揭帖。