cxgrid 单元格值随着另一单元格值变化而变化,列值改变事件

如题,cxgrid 绑定一个数据集 (ADOQuery 对应 DataSource),其中 数量,单价两列是可编辑的,金额不可编辑,当数量或单价的单元格值变掉后,金额的单元格值也要跟着变化。  有知道的大虾请帮忙解答,谢谢!

//选中列,设置Properties=CurrencyEdit 然后在设置事件Properties-> onEditValueChanged事件
procedure TForm11.cxgrdclmncxgrdtblvwcxgrd1TableView1Column1PropertiesEditValueChanged(
  Sender: TObject);
var
  quantity, price : Currency;
begin
  //提交数据
  cxgrdtblvw.DataController.Post();  //获取数量  cxgrdclmn_quantity是数量列名称
  quantity := cxgrdtblvw.DataController
    .Values[cxgrdtblvw.Controller.FocusedRecordIndex, cxgrdclmn_quantity.Index];
  //获取单价  cxgrdclmn_price是单价列名称
  price := cxgrdtblvw.DataController
    .Values[cxgrdtblvw.Controller.FocusedRecordIndex, cxgrdclmn_price.Index];  //获取单价  cxgrdclmn_total是金额列名称
  cxgrdtblvw.DataController
    .Values[cxgrdtblvw.Controller.FocusedRecordIndex, cxgrdclmn_total.Index] :=
    price * quantity;
end;

 

// 列值改变事件

1.前提是不能启用以下属性

//实现按方向左右键跳到前一个单元格或后一个单元格 , 启用这个属性,oncellClick事件会失效!
//  cxGrid1DBTableView1.OptionsBehavior.ImmediateEditor := False; //(立即编辑)把这个属性关闭之后
    // 实现按方向左右键跳到前一个单元格或后一个单元格
//  cxGrid1DBTableView1.OptionsBehavior.AlwaysShowEditor := True;

2.然后//选中列,设置Properties=CurrencyEdit 然后在设置事件Properties-> onEditValueChanged事件

procedure TfrmCaiGouShouLiouRuKuXuanZe.cxGrid1DBTableView1Column1PropertiesEditValueChanged(
  Sender: TObject);
var
  Row: Integer;
  bencishouliao, caoshoubili: string;
  zhuidashouliaoushu: Single;
begin
  cxGrid1DBTableView1.DataController.PostEditingData(); //使修改的数据立即生效,便于取列的修改值
  Row := cxGrid1DBTableView1.DataController.FocusedRecordIndex;
  if VarIsNull( cxGrid1DBTableView1.ViewData.DataController.Values[Row, 5]) then EXIT;
  bencishouliao := cxGrid1DBTableView1.ViewData.DataController.Values[Row, 5];

  //取得超收比例
  with DST_JISUAN do
  begin
    Close;
    sql.Clear;
    SQL.Text := 'exec get_purloss_pro :sup_no,:ofac_no';
    ParamByName('sup_no').AsString := DST_CAILIAO.FieldByName('sup_no').AsString;
    ParamByName('ofac_no').AsString := Self.ofac_no;
    Open;
    caoshoubili := DST_JISUAN.Fields[0].AsString;
    zhuidashouliaoushu := DST_CAILIAO.FieldByName('pur_qty').AsSingle * (1 + StrToFloat(caoshoubili));
    if (DST_CAILIAO.FieldByName('tqty').AsSingle + StrToFloat(bencishouliao)) > zhuidashouliaoushu then
    begin
      OkMsg('超出最大收料数' + FloatToStr(zhuidashouliaoushu));
      DST_CAILIAO.FieldByName('jianyi').AsString := '';
      Exit;
    end;
  end;

end;

 

也可以在表格的cxGrid1DBTableView1.EditValueChanged事件中判断

procedure TfrmCaiGouShouLiouRuKuXuanZe.cxGrid1DBTableView1EditValueChanged(
  Sender: TcxCustomGridTableView; AItem: TcxCustomGridTableItem);
var
  Row: Integer;
  bencishouliao, caoshoubili: string;
  zhuidashouliaoushu: Single;
begin
  Sender.DataController.PostEditingData(); //使修改的数据立即生效,便于取列的修改值
  Row := cxGrid1DBTableView1.DataController.FocusedRecordIndex;
  OkMsg(cxGrid1DBTableView1.ViewData.DataController.Values[Row, 5]);
  if VarIsNull( cxGrid1DBTableView1.ViewData.DataController.Values[Row, 5]) then EXIT;
  bencishouliao := cxGrid1DBTableView1.ViewData.DataController.Values[Row, 5];

  //取得超收比例
  with DST_JISUAN do
  begin
    Close;
    sql.Clear;
    SQL.Text := 'exec get_purloss_pro :sup_no,:ofac_no';
    ParamByName('sup_no').AsString := DST_CAILIAO.FieldByName('sup_no').AsString;
    ParamByName('ofac_no').AsString := Self.ofac_no;
    Open;
    caoshoubili := DST_JISUAN.Fields[0].AsString;
    zhuidashouliaoushu := DST_CAILIAO.FieldByName('pur_qty').AsSingle * (1 + StrToFloat(caoshoubili));
    if (DST_CAILIAO.FieldByName('tqty').AsSingle + StrToFloat(bencishouliao)) > zhuidashouliaoushu then
    begin
      OkMsg('超出最大收料数' + FloatToStr(zhuidashouliaoushu));
      DST_CAILIAO.FieldByName('jianyi').AsString := '';
      Exit;
    end;
  end;

end;

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值