立即注册 登录
度量快速开发平台-专业、快速的软件定制快开平台 返回首页

王爱东的个人空间 http://bbs.delit.cn/?3 [收藏] [复制] [RSS]

日志

[网格部件]单元格值变化事件的典型应用

已有 2564 次阅读2020-6-13 09:41 |个人分类:部件使用|系统分类:部件使用

实现业务:
网格部件中,有三个字段,分别是单价,数量,金额,现在要实现以下应用:
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 不满足,故不会造成无限循环。


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

手机版|小黑屋|重庆度量科技  本站关键词:快速开发平台

GMT+8, 2024-10-8 10:58 , Processed in 0.107811 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

返回顶部