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对应的行。先谢谢高手的帮助.
------解决方案--------------------
- Delphi(Pascal) code
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就行了
------解决方案--------------------
beforepost或afterpost时,去select数据,然后更新你需要的字段值,或者在FieldSetText事件中做(这个需要添加固定字段或者自己手动对每个字段绑定这个事件)
------解决方案--------------------
楼主,是想达到ERP 那样的效果,就是,在 类似DBGRID,这样的网格控件,有下拉框,选择上一列后,可以通过视图自动关联填充到其他列里面,有一个控件可以实现,就是 DBGrid 内嵌 DBLookupcombobox 可以实现,