给dbgrid这个东东post 一个 WM_SETFOCUS的消息
你试一下,看可以不

解决方案 »

  1.   

    你的想法有问题,请问你是在什么时候发这样一个消息呢,
    按一个Button吗,如果是这样,那还不如直接Post一下。
      

  2.   

    我今天做的一个界面中在dbgrid上直接更改。经测试,
    adodataset.edit;
    然后在dbgrid的单元格上改动某个字段的值,然后在没有失去这个单元格的前提下调用
    adodsmain.Post;
    adodsmain.UpdateBatch;
    则该字段保存的还是未更改以前的值,
    如果将光标TAB到下一个单元格然后再
    adodsmain.Post;
    adodsmain.UpdateBatch;
    则改变才真正post进去,
    最后保存的才是更改了的。(有dbedit等一样有这样的情况,难道各位没有遇到过吗?)
    以前我是在保存前执行
    adodamain.fieldbyname('dd').asstring:=dbedit1.text
    将所有的输入字段再重写一遍才避免了这种现象。现在我直接在dbgrid上写,总不能要我把每个单元格的值取出来又重新赋一遍吧。。
    各位高手,快快出刀!!!
      

  3.   

    postmessage(form1.handle,wm_keydown,vk_tab,0);就是向窗体发送一个tab消息
      

  4.   

    单击ADOQuery右键,把DBGrid中要显示的字段添加进来,如:f1,f2...
    如果要使f1自动post而且不失去焦点 ,可以这样:
      ADOQueryf2.FocusControl;
      ADOQueryf1.FocusControl;
      

  5.   

    事实证明我的想法是错误的, 我在adodsmain.post前加上了postmessage(form1.handle,wm_keydown,vk_tab,0);一句,但还是不行,高手们还有没有别的办法?
      

  6.   

    FocusControl好象没有这个方法???
      

  7.   

    在Post之前CheckBrowseMode一下看看。
      

  8.   

    你把字段加到dataset里,在窗体的定义中就会有类似的定义:
       ADOqueryCHZ: TWideStringField;
    其中CHZ是你在dataset中加的字段名称,ADOqueryCHZ有FocusControl方法,可以试试看。
      

  9.   

    向DBGrid发Tab键sendmessage(form1.dbgrid1.handle,wm_keydowm,#9,0);
      

  10.   

    还是不行,为什么???
      postmessage(PurchaseContractDefineForm.dbgMain.Handle,wm_keydown,vk_tab,0);
      if (adodsmain.State=dsEdit) or (adodsmain.state=dsInsert) then
        begin
          adodsmain.FieldByName('operator').Value:=mainform.username;
          adodsmain.FieldByName('operate_time').Value:=getdate;
          adodsmain.Post;
        end;
      try
       adodsmain.UpdateBatch;
    except
       adodsmain.CancelUpdates;
       self.SpeedButton_undoClick(self);
      end;
      adodsmain.close;
      adodsmain.open;
      

  11.   

    procedure TForm1.DBGrid1Exit(Sender: TObject);
    begin
      DM.Query1.Prior;
      DM.Query1.Edit;
      DM.Query1.Post;
    end;
    这样不行吗??Query的记录位置移动在Post不就可以了?