如题,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;