如何在GeneXus中使用For Each遍历Grid实现变量求和?
GeneXus销售系统总计滞后问题解决
问题原因分析
你当前的代码存在两个核心问题导致总计滞后:
- 全局变量复用错误:
&ProductSubTotal是单个全局变量,并非Grid每行的专属字段,执行For Each line in GridProduct循环时,累加的始终是当前的单个值,而非每行实际的小计。 - 界面刷新与数据同步时序问题:每次计算小计后调用
GridProduct.Load()刷新界面,但总计计算时直接遍历界面Grid行,此时界面数据可能未完成更新,导致取到上一轮的旧值,出现滞后。
修正方案
需要改用**结构数组(或集合)**存储Grid每行的完整数据,直接操作数据源而非依赖界面控件,确保数据同步:
1. 定义结构数组
先创建一个结构(比如命名为ProductLine),包含以下字段:
ProductPicture(图片)ProductPrice(单价)ProductQty(数量)ProductSubTotal(小计)
再定义一个该结构的数组变量&ProductLines,作为Grid的数据源。
2. 修改事件代码
// Grid加载事件:初始化数据源 Event GridProduct.Load &ProductLines.Clear() For Each Product &ProductLine.ProductPicture = ProductPicture &ProductLine.ProductPrice = ProductPrice &ProductLine.ProductQty = 0 &ProductLine.ProductSubTotal = 0 &ProductLines.Add(&ProductLine) EndFor GridProduct.DataSource = &ProductLines GridProduct.Load() Endevent // 加号按钮事件:增加选中行数量 Event 'BtnPlus' &SelectedIndex = GridProduct.SelectedIndex If &SelectedIndex > -1 &ProductLines.Item(&SelectedIndex).ProductQty += 1 Do 'CalculateSubTotal'(&SelectedIndex) Do 'CalculateTotal' EndIf EndEvent // 减号按钮事件:减少选中行数量(防止负数) Event 'BtnMinus' &SelectedIndex = GridProduct.SelectedIndex If &SelectedIndex > -1 And &ProductLines.Item(&SelectedIndex).ProductQty > 0 &ProductLines.Item(&SelectedIndex).ProductQty -= 1 Do 'CalculateSubTotal'(&SelectedIndex) Do 'CalculateTotal' EndIf EndEvent // 计算单行小计(传入行索引) Event 'CalculateSubTotal'(&RowIndex: Integer) &ProductLines.Item(&RowIndex).ProductSubTotal = &ProductLines.Item(&RowIndex).ProductPrice * &ProductLines.Item(&RowIndex).ProductQty GridProduct.DataSource = &ProductLines GridProduct.Load() EndEvent // 计算总计:直接遍历数据源集合 Event 'CalculateTotal' &ProductTotal = 0 For Each &Line in &ProductLines &ProductTotal += &Line.ProductSubTotal EndFor // 总计变量绑定到界面控件后,无需额外刷新Grid EndEvent
3. 界面绑定设置
确保Grid的列分别绑定到&ProductLines的对应字段:
- 数量列绑定
ProductQty - 小计列绑定
ProductSubTotal - 总计控件绑定全局变量
&ProductTotal
关键改进点
- 用结构数组存储每行数据,确保每行的数量、小计都是独立值,避免全局变量覆盖。
- 计算总计直接遍历数据源集合,而非界面Grid,确保拿到最新的实时数据,解决滞后问题。
- 减少不必要的Grid刷新操作,仅在单行数据变更时更新数据源并刷新界面。
内容的提问来源于stack exchange,提问作者dll
相关产品推荐
相关产品推荐

