设为首页
收藏本站
个人学习资料整理,不接受注册
开启辅助访问
切换到宽版
登录
禁止注册
银舟网
BBS
搜索
搜索
本版
帖子
用户
银舟网
»
银舟网
›
课外时间
›
电脑
›
PrepareEdit 中的e参数用法
返回列表
发新帖
PrepareEdit 中的e参数用法
[复制链接]
3339
|
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
1603
主题
494
回帖
6152
积分
管理员
积分
6152
加好友
发消息
回复楼主
返回列表
美图
美句
解梦
电脑
情感
驾考
相机
电子