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对应的行。先谢谢高手的帮助.
------解决方案--------------------
------解决方案--------------------
有一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就行了
------解决方案--------------------