读书人

delphi 中DBGRID 中一部分值是由其中一

发布时间: 2012-08-13 13:21:53 作者: rapoo

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对应的行。先谢谢高手的帮助.

[解决办法]

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 可以实现,

读书人网 >.NET

热点推荐