||
实现业务:
网格部件中,有三个字段,分别是单价,数量,金额,现在要实现以下应用:
1、单价和数量发生变化的时候,自动计算金额;
2、数量和金额发生变化的时候,自动计算单价;
逻辑表上的自动填充功能不能满足这样多重变化的功能,因此需要用到网格部件的“单元格值变化事件”,需要注意的是,单价数量金额三个字段发
生变化的时候,都可能触发自动计算,计算的值填入字段的时候又会触发“单元格值变化事件”,因此需要小心该事件引起的无限循环。请注意下面红色部分的控制。
实现方法:
1、在窗体的加载事件中设置一个窗体变量
'可以触发的标志
dim EventFlag = true
2、在网格部件的单元格值变化事件中写入代码:
'网格部件1 的 单元格值变化事件 事件代码:
'----->更详细说明请参考智能向导。
'参数说明:
' Value1:触发值变化的列名。字符串类型
' Value2:编辑完成后单元格的值。object类型
dim e=Me.GetEventArgs()
'满足条件的时候,才触发该事件
if EventFlag then
'1、---金额发生变化 (如果数量有值,就计算总额)
if e.Value1="单价" then
EventFlag=false
if isnull(网格部件1.GetFocusedRowValue("数量")) then
else
网格部件1.SetFocusedRowValue("金额",Round(网格部件1.GetFocusedRowValue("数量")*e.Value2,4) )
end if
EventFlag=true
end if
'2、---数量发生变化( 如果单价有值并且不是0,则计算总额;单位为空或者为0,则计算单价 )
if e.Value1="数量" then
EventFlag=false
if isnull(网格部件1.GetFocusedRowValue("单价")) or 网格部件1.GetFocusedRowValue("单价") =0 then
'有总额,计算单价
if isnull(网格部件1.GetFocusedRowValue("金额"))=false and e.Value2<>0 then
'将会触发 1、 中的代码,需要避免无限循环
网格部件1.SetFocusedRowValue("单价",Round(网格部件1.GetFocusedRowValue("金额")/e.Value2,4) )
end if
else
'计算金额
网格部件1.SetFocusedRowValue("金额",Round(网格部件1.GetFocusedRowValue("单价")* e.Value2,4) )
end if
EventFlag=true
end if
'3、---金额发生变化( 如果数量有值并且不是0,则计算单价 )
if e.Value1="金额" then
EventFlag=false
if isnull(网格部件1.GetFocusedRowValue("数量")) or 网格部件1.GetFocusedRowValue("数量") =0 then
else
'计算单价
网格部件1.SetFocusedRowValue("单价",Round(e.Value2/网格部件1.GetFocusedRowValue("数量"),4) )
end if
EventFlag=true
end if
end if
---------------------------我是分割线----------------------------------------
上面红色部分的控制主要是强调,其实要避免无限循环,下面是“单元格值变化事件”抽象后的代码:
'参数说明:
' Value1:触发值变化的列名。字符串类型
' Value2:编辑完成后单元格的值。object类型
dim e=Me.GetEventArgs()
if EventFlag then
EventFlag=false
doing .......................
EventFlag=true
end if
上面的doing......代码中,即使使用了设置焦点行的值再次引起了“单元格值变化事件”,例如:网格部件1.SetFocusedRowValue("单价",Round(e.Value2/网格部件1.GetFocusedRowValue("数量"),4) ),因为在设置焦点行值的时候,if EventFlag then 不满足,故不会造成无限循环。
Powered by Discuz! X3.2
© 2001-2013 Comsenz Inc.