设为首页
收藏本站
个人学习资料整理,不接受注册
开启辅助访问
切换到宽版
登录
禁止注册
银舟网
BBS
搜索
搜索
本版
帖子
用户
银舟网
»
银舟网
›
课外时间
›
电脑
›
PrepareEdit 中的e参数用法
返回列表
发新帖
PrepareEdit 中的e参数用法
[复制链接]
1308
|
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
回复
使用道具
举报
返回列表
发新帖
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
禁止注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
yinzhou
1602
主题
491
回帖
6135
积分
管理员
积分
6135
加好友
发消息
回复楼主
返回列表
美图
美句
解梦
电脑
情感
驾考
相机
电子