delphi 中DBGRID 中部分值是由其中一列的输入结果查询出来的,那么怎样给这几列赋值,该怎么处理

delphi 中DBGRID 中部分值是由其中一列的输入结果查询出来的,那么怎样给这几列赋值
有一DBGRID 对应的表是ITEMS_YS,有以下几个字段:DBARCODE,DNAME,DPRICEIN,DPRICEINNEW,DNUM,DMONEYTICKET
其中在输入DBARCODE 后按回车键,系统就会以输入的DBARCODE作为查询条件,查找视图V_THING 如果存在的话就从V_THING中把DNAMN,DPRICEIN,DPRICEINNEW赋值到DBGRID对应的列中,DMONEYTICKET是由NUM*DPRICEINNEW得来的,其中DNAME,DPRICEIN,DMONEYTICKET是不可以编辑的,那么问题如下:1.怎么给DNAME,DPRICEIN,DMONEYTICKET赋值;2.怎么在最后一列按ENTER键后移到下一行,不能隔行 且必须是DBARCODE对应的行。先谢谢高手的帮助.
------解决方案--------------------
1.ENTER键问题,如果是DBGridEh控件,只需设置OptionsEh->dghEnterAsTab=True即可;
DBGrid要写代码实现,设置Form1.KeyPreview:=True; 然后在Form的onKeyDown事件写代码:

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (key=13) and (ActiveControl=DBGrid1) then
  begin
    with DBGrid1 do
    begin
      if SelectedIndex=FieldCount-1 then
      begin
        DataSource.DataSet.Next;
        if DataSource.DataSet.Eof then
           DataSource.DataSet.Append;
        SelectedIndex:=0;
      end else
        SelectedIndex:=SelectedIndex+1;
    end;
  end;
end;

2.用字段的onChange事件,比如你的DBGrid1连接的是ADOQuery1,则

  private
    { Private declarations }
    procedure DBARCODEChange(Sender: TField);
    procedure DNUMChange(Sender: TField);

implementation

{$R *.dfm}

procedure TForm1.DBARCODEChange(Sender: TField);
var
  DataSet:TDataSet;
begin
  DataSet:=TField(Sender).DataSet;
  DataSet.FieldByName('DNAMN').Clear;
  DataSet.FieldByName('DPRICEIN').Clear;
  DataSet.FieldByName('DPRICEINNEW').Clear;
  with ADOQuery2 do
  begin
    Close;
    SQL.Text:='Select DNAMN,DPRICEIN,DPRICEINNEW From V_THING'
             +' Where DBARCODE='+Quotedstr(TField(Sender).AsString);
    Open;
    if not isEmpty then
    begin
      DataSet.FieldByName('DNAMN').AsString:=FieldByName('DNAMN').AsString;
      DataSet.FieldByName('DPRICEIN').AsFloat:=FieldByName('DPRICEIN').AsFloat;
      DataSet.FieldByName('DPRICEINNEW').AsFloat:=FieldByName('DPRICEINNEW').AsFloat;
    end;
  end;
end;

procedure TForm1.DNUMChange(Sender: TField);
begin
  with TField(Sender).DataSet do
    FieldByName('DMONEYTICKET').AsFloat:=FieldByName('DNUM').AsFloat*FieldByName('DPRICEINNEW').AsFloat;
end;

procedure TForm1.ADOQuery1AfterOpen(DataSet: TDataSet);
begin
  DataSet.FieldByName('DBARCODE').OnChange:=DBARCODEChange;
  DataSet.FieldByName(DNUM).OnChange:=DNUMChange;
  DataSet.FieldByName('DPRICEINNEW').OnChange:=DNUMChange;
end;

3.不可编辑问题,设置DBGrid相应的列ReadOnly属性为True就行了

------解决方案--------------------