PrepareEdit 中的e参数用法

[复制链接]
查看2239 | 回复0 | 2022-5-9 14:20:32 | 显示全部楼层 |阅读模式
PrepareEdit
准备编辑单元格的时候执行。
e参数属性:
Table:       准备编辑的表
Row:         准备编辑的行
Col:         准备编辑的列
IsFocusCell: 逻辑型,是否是焦点单元格   
Cancel:      逻辑型,默认为False,设为True取消编辑。
Continue:     逻辑型,默认为True,设置为False取消后续操作,后续单元格不会再触发PrepareEdit事件。

重要提示:千万不要在PrepareEdit事件显示Messagebox这样的对话框,因为每次进入单元格就会出现提示,这样会导致死循环的出现。
示例一
我们知道,被锁定的行是禁止用户编辑的,但是系统提供的锁定功能,非常的不灵活,因为一旦锁定,任何人都不能编辑。
你可能需要更灵活的锁定功能,例如,可能希望某一状态下的行,对于特定的人员是可以编辑的,而对于其他人是禁止编辑的;也有一种情况,对于某一列,您可能希望得到授权的人才能编辑。

我们先来看看第一种情况如何实现,假定在一个客户消费数据表,有一逻辑列,名为“已结帐”;如果某一行的已结帐列被勾选,那么我们除了经理之外,员工不可以再修改该行。
实现的代码很简单,在该表的PrepareEdit事件中输入:

If e.Row("已结帐") = True AndAlso User.Group <> "经理" Then
    e.Cancel = True
End
If
User.Group表示登录用户的分组,在用户管理中,可以给用户设置不同的组别。
再看第二种情况,假定消费表中还有一个折扣列,我们希望只有经理级别的人员,才能给客户打折,也就是只有经理级别的操作人员才能在该列中输入或修改数据,实现代码同样很简单,在该表的PrepareEdit事件中输入:
If e.Col.Name = "折扣" AndAlso User.Group <> "经理" Then
    e.Cancel = True
End
If
还来一个例子,我们知道易表有一个锁定非空内容的功能,也就是只有空白单元格才能输入数据,一旦输入就不能修改,在Foxtable我们也可以很轻松地实现这个功能,例如希望锁定“标注”列的非空内容:
If e.Col.Name = "标注" AndAlso e.Row.IsNull("标注") = False Then
    e.Cancel =
True
End
If

从上面的演示可以看出,利用PrepareEdit事件,可以带来强大的编辑控制功能,远不是系统的审核功能所能比拟的。
在表中进行剪切、粘贴的时候,会针对每一个可能会受影响的单元格触发PrepareEdit事件,从而让编辑控制做到滴水不漏。

示例二
本示例请参考CaseStudy目录下的示例文件“自动输入.Table”。
假定项目中有一个名为“行政区域”的基础数据表,这个表已经输入了全国所有县级行政区域的资料,包括省市、市县、区号、邮编四列;现在我们在客户表中输入数据,假定客户表也有这么四列,显然最好的输入方式是,客户表省市列能够根据行政区域表的设置,列出所有的省市供选择,选择省市之后,市县列能列出该省市所有的市县供选择,而选择市县之后,区号和邮编能够自动输入。
区号和邮编的自动输入,我们将在后续章节中介绍,我们现在看看如何利用PrepareEdit实现动态的列表项目。
1、先在项目事件AfterOpenProject中设置如下代码:
Tables("客户").Cols("省市").Combolist = DataTables("行政区域").GetComboListString("省市")
这样每次打开项目,就会自动从行政区域表提取不重复的省市名称,作为客户表省市列的列表项目。
2、在客户表的PrepareEdit事件中输入如下代码:
If e.Col.Name = "县市" Then '如果正在编辑的是县市列
    '从行政区域表提取该省市的县市作为列表项目
     e.Col.Combolist = DataTables("行政区域").GetComboListString("县市", "[省市] = '" & e.Row("省市") & "'")
End
If
这样在客户表县市列输入内容的时候,会自动根据已经输入的省市,列出该省市的全部县市供选择。
3、到这一步,我们的设计目标已经完成,但是还有一个小问题,我们前面提到在表中进行剪切、粘贴的时候,会针对每一个可能会受影响的单元格触发PrepareEdit事件,这样的特性会给本例带来一些副作用,如果你在县市列复制粘贴1000行数据,那么就会触发一千次PrepareEdit事件,这可能需要一个漫长的执行过程。显然本例的PrepareEdit事件,只是针对正在编辑的单元格,也就是焦点所在单元格,对于因为受粘贴而影响的其他单元格,并没有必要执行此事件。为此,我们将PrepareEdit事件代码改为:
If e.IsFocusCell Then '如果是焦点所在单元格
   
If e.Col.Name = "县市" Then '如果正在编辑的是县市列
        '从行政区域表提取该省市的县市作为列表项目

        e.Col.Combolist = DataTables("行政区域").GetComboListString("县市", "[省市] = '" & e.Row("省市") & "'")
    End If
End
If

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 禁止注册

本版积分规则